为什么 C# 不让我像字典一样对动态进行索引?
Why doesn't C# let me index into dynamic like a dictionary?
C# 中的 dynamic
关键字可以让我做这样的事情:
dynamic obj = ....;
var foo = obj.foo;
其中 属性 引用 obj.foo
在运行时解析。
既然 属性 是在运行时解析的,为什么不能将 属性 本身指定为变量?例如,
var propName = "foo";
var foo = obj[propName];
?
我知道您可以通过反射或将对象转换为字典来完成类似的事情。我对解决方案不感兴趣,因为它解释了为什么 C# 首先不支持 Javascript-like 方括号查找。
之所以没有这样做,一个可能的原因是歧义。
考虑这个例子:
dynamic d = new Dictionary<string,object>() {
{"Count", 2}
};
object c = d["Count"];
一方面,字典有属性个计数,字典有一个条目,所以c应该设置为1。另一方面,字典有一个关键字条目"Count", 所以c应该设置为2.
选择这些备选方案中的任何一个都会任意放弃另一种可能性。在这种情况下,最好不要首先引入该功能。
C# 中的 dynamic
关键字可以让我做这样的事情:
dynamic obj = ....;
var foo = obj.foo;
其中 属性 引用 obj.foo
在运行时解析。
既然 属性 是在运行时解析的,为什么不能将 属性 本身指定为变量?例如,
var propName = "foo";
var foo = obj[propName];
?
我知道您可以通过反射或将对象转换为字典来完成类似的事情。我对解决方案不感兴趣,因为它解释了为什么 C# 首先不支持 Javascript-like 方括号查找。
之所以没有这样做,一个可能的原因是歧义。
考虑这个例子:
dynamic d = new Dictionary<string,object>() {
{"Count", 2}
};
object c = d["Count"];
一方面,字典有属性个计数,字典有一个条目,所以c应该设置为1。另一方面,字典有一个关键字条目"Count", 所以c应该设置为2.
选择这些备选方案中的任何一个都会任意放弃另一种可能性。在这种情况下,最好不要首先引入该功能。