2 回答

TA貢獻1860條經驗 獲得超8個贊
您需要進行修改,UtilityClass以便該方法也向下傳遞泛型類型:
internal void Method<T>(GenericClass<T> genericClass) where T: BaseType
{
}

TA貢獻1871條經驗 獲得超13個贊
這個問題每天都會被問到。再一次!
class Cage<T> where T : Animal
{
public void Add(T t) { ... }
}
現在你的問題是:為什么這是非法的?
Cage<Animal> cage = new Cage<Gerbil>();
因為這一行是合法的:
cage.Add(new Tiger());
Cage<Animal>有一個方法Add,它需要Animal. ATiger是 anAnimal所以必須是合法的。但這意味著我們只是將老虎放入沙鼠籠中。
由于該行必須是合法的并且會導致類型錯誤,因此其他一些行必須是非法的,現在您知道它是哪一行了。
你想要的特性稱為泛型協方差,它在 C# 中是合法的,當:
泛型類型是接口或委托
可變類型參數是引用類型
接口或委托已被標記為安全的變化。
例如:
IEnumerable<Animal> animals = new List<Tiger>() { new Tiger() };
那是合法的。List<Tiger>implements IEnumerable<Tiger>,它是一個接口并標記為協方差安全,因此可以將其分配給IEnumerable<Animal>。
您會注意到無法將鴨子放入動物序列中,因此無法將鴨子放入老虎序列中。這就是我們如何知道協方差是安全的。
- 2 回答
- 0 關注
- 201 瀏覽
添加回答
舉報