我在强制转换泛型类型时遇到问题。
例如,我有一些类(class):
public class Dog
{
}
public class Husky : Dog
{
}
public class MyWrapper<T> where T : class
{
}
然后我想做这样的事情,但我不知道该怎么做
MyWrapper<Husky> husky = new MyWrapper<Husky>();
List<MyWrapper<Dog>> dogs= new List<MyWrapper<Dog>>();
dogs.Add(husky); // how to cast husky to MyWrapper<Dog>?
编辑:将
Animal<T>
更改为MyWrapper<T>
,所以这将是更适当的示例 最佳答案
您可以在C#4或更高版本中使用接口(interface)的generic covariance。为此,您需要定义一个协变接口(interface)(使用out
),并让MyWrapper
实现该接口(interface):
public class Dog
{
}
public class Husky : Dog
{
}
public class MyWrapper<T> : IMyWrapper<T> where T : class
{
}
public interface IMyWrapper<out T> where T : class
{
}
然后,您可以执行以下操作:
var husky = new MyWrapper<Husky>();
var dogs = new List<IMyWrapper<Dog>>();
dogs.Add(husky);