2014-01-16 56 views
3
public interface SomeInterfaceName<out T> where T : struct 
    { 
    T? SomePropertyName { get; } 
    } 

我得到的错误是:当创建差异接口

错误CS1961:无效的方差:类型参数“T”必须是“SomeInterfaceName.SomePropertyName”目不暇接有效。 'T'是协变的。

我不要需要这是协变。我也可以删除out关键字。但是,然后Resharper建议我可以使用Covariance,我同意,我不明白为什么我不能。我只使用T作为返回值。还是因为可空<>不支持它?

任何人都可以解释错误吗?

回答

4

使用struct约束协变来制作类型参数是毫无意义的。根本不支持值类型类型参数的通用差异 - 例如,即使存在从intlongobject的转换,也没有从IEnumerable<int>IEnumerable<long>IEnumerable<object>的转换。

您实际遇到的问题是Nullable<T>不是协变的,但您尝试在Nullable<T>类型的属性中使用T。这就是导致错误的原因。

就我个人而言,如果输入参数与struct约束不能被声明为协变或逆变(因为它不会有用),但它本身并不被禁止,我个人认为会更好。