【问题标题】:Why is this an invalid variance?为什么这是一个无效的差异?
【发布时间】:2012-08-13 19:35:48
【问题描述】:

我正在尝试构建的确切代码:

    public interface IMapContainer<out T> where T : MapRoomBase
    {
        String GetName();

        IEnumerable<T> GetRooms();
    }

我收到此错误: 无效方差:类型参数“T”必须在“MapLibrary.IMapContainer.GetRooms()”上始终有效。 'T' 是协变的。

我的印象是这将是有效的,因为 IEnumerable 只返回项目,并且不能添加任何项目。为什么这不安全+有效?

【问题讨论】:

  • 对不起,为什么out T?你需要那个out吗?
  • 为什么 T 是你的接口的输出参数?你想达到什么目的?从我的角度来看,这看起来很奇怪/错误。
  • @exacerbateexpert 是的。这就是 Julien Lebosquain 可以给出正确答案的方式。
  • @FrédéricHamidi 感谢您提供的信息!

标签: c# silverlight-4.0 covariance


【解决方案1】:

确保您没有针对旧的框架版本。 IEnumerable&lt;T&gt; 从 .NET 4 开始是协变的。您的代码在 .NET 4 下编译良好,但由于您在 .NET 3.5 上提到的错误而失败。

【讨论】:

  • 似乎 SL 4 中的 IEnumerable 不支持协方差。您的回答帮助我找到了这一点,虽然我不明白这是为什么...forums.silverlight.net/t/184882.aspx/1
  • 在 SL4 中支持协方差,只是像 IEnumerable 这样的 BCL 类型仅在 SL5 中被设为协变,请参阅SO answer
猜你喜欢
  • 2023-01-13
  • 2011-04-08
  • 1970-01-01
  • 2019-04-11
  • 2017-03-27
  • 2014-08-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多