重影通用方法类约束

时间:2019-09-24 07:17:04

标签: c# generics

是否有一种将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, IFeatureXIReturn<IFeatureX>

看来我无法或不能安全投放。

我不能使用objectdynamic,因为IFeatureX实际上是IProtobufBody,并且它是我用来进行集成测试级别的标签接口,可确保所有程序集都可以容器中的存储实例已定义了protobuf合同。

3 个答案:

答案 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

此示例显示了为什么默认情况下不允许使用它。

有关键字inout,可让您使用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。