是否有一种将IReturn<T> ... where T : class, IFeatureX
存储为变量类型IReturn<IFeatureX>
的方法,或者您可以解释为什么无法做到这一点?
让我们说我有一个容器构造函数:
public ContainerX(IReturn<IFeatureX> body) : this()
{
Body = body;
}
我想说IFeatureX也扩展了class
,我尝试将构造函数更改为private并使用:
public static ContainerX CreateInstance<T>(IReturn<T> instance)
where T : class, IFeatureX => new ContainerX { Body = instance };
但是,c#不知道IReturn<T> ... where T : class, IFeatureX
是IReturn<IFeatureX>
。
看来我无法或不能安全投放。
我不能使用object
或dynamic
,因为IFeatureX
实际上是IProtobufBody
,并且它是我用来进行集成测试级别的标签接口,可确保所有程序集都可以容器中的存储实例已定义了protobuf合同。
答案 0 :(得分:0)
您只需将IReturn<T>
声明为IReturn<out T>
即可使{{1}} 协变。您可以阅读有关协方差和对数here的更多信息。
答案 1 :(得分:0)
这是协方差和对数(see here)的问题。
假设您有一个名为Dog
的类,该类继承自Animal
,请考虑以下代码:
List<Dog> l = new List<Dog>();
List<Animal> la = l;
la.Add(new Giraffe()); // this is not allowed
此示例显示了为什么默认情况下不允许使用它。
有关键字in
和out
,可让您使用IReturn<in T>
或IReturn<out T>
之类的协方差和协方差。
使用in
时,可以将IReturn<Object>
对象存储在类型IReturn<Class>
的变量中,并在IReturn
中定义使用T
的函数输入变量类型。
使用out
时,可以将IReturn<Class>
对象存储在类型IReturn<Object>
的变量中,并在IReturn
中定义使用T
的函数返回类型。
如果您需要T
在某些函数中是输入变量类型,而在其他函数中是返回类型,则只能使用确切的类。
答案 2 :(得分:0)
对不起,其他答案不适用。在这种情况下,答案是要
IReturn<T> ... where T : FeatureBase
并使实例扩展FeatureBase。