繁体   English   中英

创建接口时的差异

[英]Variance when creating interfaces

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

我得到的错误是:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM