public interface SomeInterfaceName<out T> where T : struct
{
T? SomePropertyName { get; }
}
我得到的错误是:
错误CS1961:无效方差:类型参数“T”必须在“SomeInterfaceName.SomePropertyName”上不变地有效。 'T'是协变的。
我不需要这是Covariant。我也可以删除out关键字。但是后来Resharper暗示我可以使用Covariance并且我同意,我不明白为什么我不能。我只使用T作为返回值。或者是因为Nullable&lt;&gt;不支持吗?
有人可以解释错误吗?
答案 0 :(得分:4)
使用struct
约束协变来创建类型参数毫无意义。根本不支持值类型类型参数的通用方差 - 例如,即使来自{{1}的转换,也没有从IEnumerable<int>
到IEnumerable<long>
或IEnumerable<object>
的转换} int
和long
。
您遇到的问题是object
不是协变的,但您尝试在Nullable<T>
类型的属性中使用T
。这就是导致错误的原因。
我个人认为如果带有Nullable<T>
约束的类型参数不能被声明为协变或逆变(假设它没有用)会更好,但这本身并不是禁止的。 / p>