【发布时间】:2017-01-31 01:40:48
【问题描述】:
我想了解动态关键字在以下代码中的工作原理。我发现许多帖子讨论了如何在 IList 上调用 Add() 导致 RuntimeBinderException,但并没有完全解释为什么以下代码不起作用:
[TestFixture]
public class TestDynamicOfIList
{
[Test]
public void Test1()
{
dynamic d1 = new ClassA();
dynamic d2 = new ClassA();
List<dynamic> dynamicList = new List<dynamic>();
dynamicList.Add(d1);
dynamicList.Add(d2);
ClassGroup group = new ClassGroup();
foreach (dynamic dynamicClassA in dynamicList)
{
// using var will fail during runtime! Need to use explicit type
var sameObject = DoNothing(dynamicClassA);
group.ClassAList.Add(sameObject);
}
}
private ClassA DoNothing(dynamic classA)
{
return classA;
}
public class ClassA
{
}
public class ClassGroup
{
public IList<ClassA> ClassAList { get; } = new List<ClassA>();
}
}
}
在上面的代码中,ClassGroup.ClassAList 属性为泛型 IList 定义了一个类“ClassA”,我看不出为什么编译器无法进行类型检查,也看不出它在运行时会失败。
我在 StackOverflow 上发现了几个类似的问题:
How to create a List with a dynamic object type C#
Does not contain a definition for "Add"
为什么我用var sameObject的时候不行,但是用ClassA sameObject就可以了?好像认为sameObject变量的类型是动态的,当方法DoNothing() 明确返回ClassA
【问题讨论】:
-
我相信这是这个问题的重复:stackoverflow.com/q/9382130/573218
-
其实经过考虑,并不是一模一样的。链接的问题确实解释了为什么相同对象被编译器确定为动态的。