这是我在使用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的类型相同!

最佳答案

这里没有什么微妙的事情发生:

  • foo的类型为IList<MyClass>,而IList<T>没有AddRange方法
  • 栏的类型为List<MyClass>,而List<T>的类型为AddRange。

  • 就这样。在C++中将是相同的。

    更新:另外,您正在调用GetType(),它获取对象的运行时类型-在编译时,编译器正在查看foo和bar变量的静态类型。

    考虑Object myObj = "MyString"可能会使事情变得更清晰,因为'Object'和'String'之间存在更明显的区别,即使它们具有与IList和List相同的继承关系。

    10-07 12:59
    查看更多