[英]Assignments using templates in c#
public class Animal
{
}
public class Cat : Animal
{
}
public class AnimalBag<T> where T : Animal
{
}
...
AnimalBag<Animal> bag = new AnimalBag<Cat>();
我收到此錯誤:
無法將類型
AnimalBag<Cat>
隱式轉換為“AnimalBag”
如果我試試這個:
AnimalBag<Animal> bag = (AnimalBag<Animal>) new AnimalBag<Cat>();
無法將
AnimalBag<Cat>
類型轉換為AnimalBag<Animal>
。
如何在C#中解決此類問題? 這在Java中非常有效。
聲明AnimalBag<Animal> bag
說明包將能夠存儲任何類型的動物 。 賦值= new AnimalBag<Cat>();
與此相矛盾的是,它實際上只能存儲貓 。 這是什么,因為它不可能兩者兼而有之?
這種情況是co-variant發揮作用的地方,但是co-variant不適用於類 ,只有接口和委托 ,所以你需要使用out
關鍵字為co-variant定義interface
:
public interface IAnimalBag<out T> where T : Animal
{
}
public class AnimalBag<T> : IAnimalBag<T> where T: Animal
{
}
然后你可以分配:
IAnimalBag<Animal> bag = new AnimalBag<Cat>();
您可以在泛型中檢查更多的協方差和反差
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.