繁体   English   中英

阴影泛型方法 class 约束

[英]Shadowing generic method class constraint

有没有办法存储IReturn<T>... where T: class, IFeatureX在变量类型IReturn<IFeatureX>或者你能解释为什么不能这样做吗?


假设我有一个容器构造函数:

public ContainerX(IReturn<IFeatureX> body) : this()
{
    Body = body;
}

我想说 IFeatureX 也扩展class ,我尝试将构造函数更改为私有并使用:

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并且它是一个 label 接口,我用来进行集成测试级别保证在容器中存储实例的所有程序集都定义了 protobuf 合同。

您只需要通过将IReturn<T>声明为IReturn<out T>来使其成为协变的。 您可以在此处阅读有关协变和逆变的更多信息。

这是一个协变和逆变的问题( 见这里)。

假设您有一个名为Dog的 class 继承自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> object 存储在IReturn<Class>类型的变量中,并在IReturn中定义使用T作为输入变量类型的函数。

当您使用out ,您可以将IReturn<Class> object 存储在IReturn<Object>类型的变量中,并在IReturn中定义使用T作为返回类型的函数。

如果您需要T成为某些函数中的输入变量类型和其他函数中的返回类型,那么您只能使用确切的 class。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM