"A <T>(IList<T> x) where T : I" 和 "A(IList<I> x)" 的区别?

Difference between "A <T>(IList<T> x) where T : I" and "A(IList<I> x)"?

有什么区别

public void MyMethod<T>(IList<T> myParameter) where T : IMyInterface

public void MyMethod(IList<IMyInterface> myParameter)

?

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 个对象。