创建接口时的差异


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

我得到的错误是:

错误 CS1961:方差无效:类型参数"T"在"SomeInterfaceName.SomePropertyName"上必须始终有效。"T"是协变。

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

谁能解释这个错误?

使用struct约束协变创建类型参数是没有意义的。值类型类型参数根本不支持泛型方差 - 例如,即使存在从intlongobject的转换,也没有从IEnumerable<int>IEnumerable<long>IEnumerable<object>的转换。

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

我个人认为,如果不能将具有struct约束的类型参数声明为协变或逆变(鉴于它没有用),但本身并不被禁止,那就更好了。

相关内容

  • 没有找到相关文章

最新更新