【问题标题】:Covariance out Issue with Generic Collection in an Interface接口中通用集合的协方差问题
【发布时间】:2013-01-23 18:45:03
【问题描述】:

我有点困惑为什么我在这里遇到这个错误。既然我已经将T 声明为out,那么返回它的类型不应该可以吗?

public interface IWebFeed<out T> where T : BaseItem
{
    List<T> getItems();

    void loadFeed();
}

相反,我得到:

协变类型参数T' must be invariantly valid on Shared.Service.Feed.IWebFeed.getItems()'

编辑:因此,正如 mbeckish 在他的链接中指出的那样,将 List&lt;T&gt; 更改为 IEnumberable&lt;T&gt; 应该可以解决此问题,但是当我遵循 IEnumerable 的声明时,我得到了以下:

using System;
namespace System.Collections.Generic
{
    public interface IEnumerable<T> : IEnumerable
    {
        //
        // Methods
        //

        IEnumerator<T> GetEnumerator();
    }
}

这是 Xamarin 或他们的 PCL 中的错误吗? T 不是 out 的事实?

【问题讨论】:

  • 完全脱离主题,but List&lt;T&gt; getItems(); 带有小写 g 听起来太 Java 了。将其更改为 GetItems()Items {get;}
  • 好吧,因为我是一名 Java / Objective-C 程序员,使用 Xamarin / C#,这可能就是原因:P 这是一个常见的符号吗?如果有,请注明!
  • @mbeckish:我很感激,但我得到了完全相同的错误,将 List&lt;T&gt; 更改为 IEnumerable&lt;T&gt;
  • @CuongLe 我使用的是 Xamarin,而不是 MS C#。

标签: c# generics mono covariance xamarin


【解决方案1】:

MonoTouch ( Xamarin ) 尚不支持接口变化,并且应该会在未来的版本中推出,因为 Mono 最近添加了接口变化。

【讨论】:

    【解决方案2】:

    你需要把GetItems方法的定义改成如下...

    List<BaseItem> GetItems();
    

    这是因为您声明了对T 的限制,它必须符合BaseItem 的形状,因此为了保持差异,您必须限制列表中的项目类型。这允许您创建多个 BaseItem 类列表并交换它们,而无需显式转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多