C#中的对象赋值

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

没有什么比这更微妙的了:

  • foo具有类型IList<MyClass>,IList<T>并且没有AddRange方法
  • bar具有类型List<MyClass>并且List<T>具有AddRange方法.

就这样.它在C++中也是一样的.

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

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


Dav*_*ton 8

问题是你正在使用界面而IList没有AddRangeList确实有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.