泛型类型参数是实现接口的类

时间:2018-08-08 14:45:58

标签: c# generics

假设我们有一个实现接口的类

class MyParaClass : IMyParaInterface

另一个名为MyObject的类,它使用通用T

class MyObject<T> where T: IMyParaInterface

现在我有一个可以接受此参数的方法

Print(MyObject<IMyParaInterface> parameter)

当我得到一个类型为MyObject<MyParaClass>的对象,并尝试将其传递给Print方法时,构建失败,因为它无法将MyObject<MyParaClass>转换为MyObject<IMyParaInterface>

我认为MyParaClass实现IMyParaInterface应该没有问题。如何解决或解决这个问题?

1 个答案:

答案 0 :(得分:2)

您应该将Print方法定义为模板方法:

void Print<T>(MyObject<T> parameter) where T : IMyParaInterface {}

这意味着该方法将采用任何MyObject <>实例,该实例的类型参数实现您的IMyParaInterface接口。

原始Print()代码的问题在于,它仅接受MyObject 作为输入。注意,MyObject 不是MyObject 类型的实例。

还有另一种解决方案,您可以在其中通过定义对象的接口来使用.net的协方差/协方差功能,其中类型参数将被标记为协变( out T)。

public interface IMyObject<out T> where T: IMyParaInterface {}

public class MyObject<T> : IMyObject<T> where T: IMyParaInterface {}


public static void Print(IMyObject<IMyParaInterface> parameter)  {}

在这种情况下,MyObject 将与IMyObject 类型兼容。

您可以在此处阅读有关协方差/相反性的信息:https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance