为什么我不能索引到ExpandoObject?

今天在研究C#动态时,有些东西让我感到惊讶(我从未使用过它们,但最近我一直在尝试使用Nancy Web框架)。 我发现我不能这样做:

dynamic expando = new ExpandoObject(); expando.name = "John"; Console.WriteLine(expando["name"]); 

最后一行抛出exception:

无法将带有[]的索引应用于“System.Dynamic.ExpandoObject”类型的表达式

我理解错误信息,但我不明白为什么会这样。 我查看了ExpandoObject的文档,它显式地实现了IDictionary ,因此有一个this.[index]方法( MSDN )。 为什么我不能打电话给它?

当然,没有什么可以阻止我手动将ExpandoObject向下转换为字典然后索引到它中,但这种方式无视这一点; 它也没有解释Expando如何能够隐藏其中一个接口的方法。

这里发生了什么?

Expando如何能够隐藏其中一个接口的方法。

因为正如您在文档中正确发现的那样, 索引器是一个显式的接口实现 。 从显式接口实现教程 :

实现接口的类可以显式实现该接口的成员。 当显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问它。

这意味着您必须将引用转换为接口才能访问它:

 ((IDictionary)expando)["name"]