[英]Variance when creating interfaces
public interface SomeInterfaceName<out T> where T : struct
{
T? SomePropertyName { get; }
}
我得到的错误是:
错误CS1961:无效方差:类型参数“T”必须在“SomeInterfaceName.SomePropertyName”上不变地有效。 'T'是协变的。
我不需要这是Covariant。 我也可以删除out关键字。 但是后来Resharper暗示我可以使用Covariance并且我同意,我不明白为什么我不能。 我只使用T作为返回值。 或者是因为Nullable <>不支持它?
任何人都可以解释错误吗?
使用struct
约束协变来创建一个类型参数是没有意义的。 根本不支持值类型类型参数的通用方差 - 例如,即使存在从int
到long
和object
的转换,也没有从IEnumerable<int>
到IEnumerable<long>
或IEnumerable<object>
的转换。
您实际遇到的问题是Nullable<T>
不是协变的,但您尝试在Nullable<T>
类型的属性中使用T
这就是导致错误的原因。
我个人认为如果带有struct
约束的类型参数不能被声明为协变或逆变(假设它没有用)会更好,但这本身并不是禁止的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.