例如,如何存储所有使用从同一基类派生的类型的DataContainer列表。
public class Animal {}
public class Cat : Animal {}
public class Dog : Animal {}
public class DataContainer <TData> where TData : Animal {
TData innerObject = new TData ();
public TData GetData () {
return innerObject;
}
}
public class DataManager {
static void Main () {
DataContainer<Cat> CatData = new DataContainer<Cat> ();
DataContainer<Dog> DogData = new DataContainer<Dog> ();
var AnimalData = new List<DataContainer<Animal>> ();
AnimalData.Add (CatData);
AnimalData.Add (DogData);
for (int i = 0; i < AnimalData.Count; i++) {
Animal animal = AnimalData[i].GetData ();
}
}
}
如果使用泛型类是不可能的,那么可以使用Arrays吗?
编辑:出现此错误:ArrayTypeMismatchException: Source array type cannot be assigned to destination array type.
这会导致ArrayTypeMismatchException:
public interface IDataContainer <out TData> where TData : Animal {
}
public class DataContainer <TData> : IDataContainer<TData> where TData : Animal {
}
public class Tester () {
static void Main () {
var AnimalData = new List<DataContainer<Animal>> ();
var CatData = new DataContainer<Cat> ();
AnimalData.Add (CatData as IDataContainer<Animal>); //Error
}
}
在Unity 5.2中运行
答案 0 :(得分:2)
问题是您需要通用类具有covariant类型参数。
您只能在界面上执行此操作,因此请创建一个:
public interface IDataContainer <out TData> where TData : Animal
{
TData GetData ();
}
请注意使用out
将TData
标记为协变。现在让您的DataContainer
类实现接口,当您在客户端代码中保留引用时,请确保它为IDataContainer
。现在它应该让你按照预期存储它。
请注意,协变接口有特殊要求,即泛型类型参数不能用作任何方法的参数类型(有关更多信息,请参阅MSDN链接)。