Was*_*RAR 5 c# object variable-assignment
这是我在使用C#IList集合时遇到的问题
IList<MyClass> foo = new List<MyClass>();
var bar = new List<MyClass>();
foo.AddRange() // doesn't compile
bar.AddRange() // compile
Run Code Online (Sandbox Code Playgroud)
据我所知,在C#(与C++相反)中,当我们用这种语法创建一个对象时,对象类型得到右侧(赋值)而不是左侧(赋值).
我在这里想念一下!
EDIT
我仍然没有得到它,即使你的答案,foo和酒吧有相同的类型!

Wil*_*ean 18
没有什么比这更微妙的了:
IList<MyClass>,IList<T>并且没有AddRange方法List<MyClass>并且List<T>具有AddRange方法.就这样.它在C++中也是一样的.
更新:在编辑中,您正在调用GetType(),它获取对象的运行时类型 - 在编译时编译器正在查看foo和bar变量的静态类型.
考虑Object myObj = "MyString"可能使事情变得更清楚,因为'Object'和'String'之间存在更明显的区别,即使它们与IList和List具有相同的继承关系
问题是你正在使用界面而IList没有AddRange但List确实有AddRange
如果你改成它
List<MyClass> foo = new List<MyClass>();
Run Code Online (Sandbox Code Playgroud)
它会工作.因为它有这种方法.
这里是 IList有
你也可以
IEnumerable<MyClass> foo = new List<MyClass>();
Run Code Online (Sandbox Code Playgroud)
你会发现这更加限制了它
编辑您的编辑:
它们都是同一类型,因为两者都是Lists.不同之处在于您使用的变量.通过使用该接口,您可以将操作限制为接口支持的操作.作为List实现IList,IList具有一部分操作List.
基础对象仍然是List.