为什么C#不让我像字典一样进行动态索引?

wrs*_*der 2 c# language-design

dynamicC#中的关键字可以让我这样做:

dynamic obj = ....;
var foo = obj.foo;
Run Code Online (Sandbox Code Playgroud)

obj.foo在运行时解析属性引用的位置.

由于属性是在运行时解析的,为什么不能将属性本身指定为变量?例如,

var propName = "foo";
var foo = obj[propName];
Run Code Online (Sandbox Code Playgroud)

?

我知道你可以通过反射或将对象转换为Dictionary来完成类似的事情.我对解决方案不感兴趣,因为它解释了为什么C#首先不支持类似Javascript的方括号查找.

das*_*ght 6

为什么没有这样做的一个可能原因是模棱两可.

考虑这个例子:

dynamic d = new Dictionary<string,object>() {
    {"Count", 2}
};
object c = d["Count"];
Run Code Online (Sandbox Code Playgroud)

一方面,字典具有属性Count,字典有一个条目,因此c应设置为1.另一方面,字典有一个键"Count"的条目,因此c应设置为2.

选择这些替代方案中的任何一个都会随意丢弃另一种可能性.在这种情况下,最好不要首先介绍该功能.