假设我们有一个实现接口的类
class MyParaClass : IMyParaInterface
另一个名为MyObject的类,它使用通用T
class MyObject<T> where T: IMyParaInterface
现在我有一个可以接受此参数的方法
Print(MyObject<IMyParaInterface> parameter)
当我得到一个类型为MyObject<MyParaClass>
的对象,并尝试将其传递给Print
方法时,构建失败,因为它无法将MyObject<MyParaClass>
转换为MyObject<IMyParaInterface>
>
我认为MyParaClass
实现IMyParaInterface
应该没有问题。如何解决或解决这个问题?
答案 0 :(得分:2)
您应该将Print方法定义为模板方法:
void Print<T>(MyObject<T> parameter) where T : IMyParaInterface {}
这意味着该方法将采用任何MyObject <>实例,该实例的类型参数实现您的IMyParaInterface接口。
原始Print()代码的问题在于,它仅接受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
您可以在此处阅读有关协方差/相反性的信息:https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance