“A <t>(IList <t> x),其中T:I”和“A(IList <x> x)”之间的区别?</i> </t> </t>

时间:2015-01-22 23:14:14

标签: c# generics methods types interface

之间有什么区别
public void MyMethod<T>(IList<T> myParameter) where T : IMyInterface

public void MyMethod(IList<IMyInterface> myParameter)

1 个答案:

答案 0 :(得分:8)

IList<T>不是covariant,因此您无法将IList<SomeObjectThatImplementsIMyInterface>传递给第二种方法。

假设你可以,而且你有:

class MyClass1 : IMyInterface {}
class MyClass2 : IMyInterface {}

并且MyMethod的实施是:

MyMethod(IList<IMyInterface> myParameter)
{
    // perfectly valid since myParameter can hold 
    // any type that implements IMyInterface
    myParameter.Add(new MyClass2());
}

如果你试图打电话

MyMethod(new List<MyClass1>()) ;

它会在运行时失败,因为列表被定义为包含MyClass1个对象,并且不能保存MyClass2个对象。