public interface SomeInterfaceName<out T> where T : struct
{
T? SomePropertyName { get; }
}
我得到的错误是:
错误 CS1961:方差无效:类型参数"T"在"SomeInterfaceName.SomePropertyName"上必须始终有效。"T"是协变。
我不需要这是协变的。我也可以删除 out 关键字。但是后来Resharper建议我可以使用协方差,我同意,我不明白为什么我不能。我只使用 T 作为返回值。还是因为 Nullable<> 不支持它?
谁能解释这个错误?
使用struct
约束协变创建类型参数是没有意义的。值类型类型参数根本不支持泛型方差 - 例如,即使存在从int
到long
和object
的转换,也没有从IEnumerable<int>
到IEnumerable<long>
或IEnumerable<object>
的转换。
您实际遇到的问题是Nullable<T>
不是协变的,但您正在尝试在类型 Nullable<T>
的属性中使用T
。这就是导致错误的原因。
我个人认为,如果不能将具有struct
约束的类型参数声明为协变或逆变(鉴于它没有用),但本身并不被禁止,那就更好了。