我在强制转换泛型类型时遇到问题。

例如,我有一些类(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);

10-08 01:22