[英]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, IFeatureX
是IReturn<IFeatureX>
。
看来我无法施放或安全施放它。
我不能使用object
或dynamic
的,因为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
此示例说明了为什么默认情况下不允许这样做。
有关键字in
和out
可让您使用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.