创建接口时的差异

时间:2014-01-16 14:06:53

标签: c# interface nullable covariance

  public interface SomeInterfaceName<out T> where T : struct
  {
    T? SomePropertyName { get; }
  }

我得到的错误是:

  

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

我不需要这是Covariant。我也可以删除out关键字。但是后来Resharper暗示我可以使用Covariance并且我同意,我不明白为什么我不能。我只使用T作为返回值。或者是因为Nullable&lt;&gt;不支持吗?

有人可以解释错误吗?

1 个答案:

答案 0 :(得分:4)

使用struct约束协变来创建类型参数毫无意义。根本不支持值类型类型参数的通用方差 - 例如,即使来自{{1}的转换,也没有从IEnumerable<int>IEnumerable<long>IEnumerable<object>的转换} intlong

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

我个人认为如果带有Nullable<T>约束的类型参数不能被声明为协变或逆变(假设它没有用)会更好,但这本身并不是禁止的。 / p>