这是我在使用C#IList集合时遇到的问题
IList<MyClass> foo = new List<MyClass>();
var bar = new List<MyClass>();
foo.AddRange() // doesn't compile
bar.AddRange() // compile
据我所知,在C#中(与C++相反),当我们使用这种语法创建对象时,对象类型将获得右侧(赋值)而不是左侧(声明)。
我在这里想念什么吗!
EDIT
我仍然不明白,即使在您回答完之后,foo和bar的类型相同!
最佳答案
这里没有什么微妙的事情发生:
IList<MyClass>
,而IList<T>
没有AddRange方法List<MyClass>
,而List<T>
的类型为AddRange。 就这样。在C++中将是相同的。
更新:另外,您正在调用GetType(),它获取对象的运行时类型-在编译时,编译器正在查看foo和bar变量的静态类型。
考虑
Object myObj = "MyString"
可能会使事情变得更清晰,因为'Object'和'String'之间存在更明显的区别,即使它们具有与IList和List相同的继承关系。