【问题标题】:Cast needed for generic constraints通用约束所需的演员表
【发布时间】:2017-07-10 10:52:09
【问题描述】:

我创建了一个具有两个泛型参数的方法,其中一个参数 (itemsToAdd) 必须与下一个参数 (inputList) 的泛型参数类型相同。

查看此演示代码:

public class GenericsDemo
{
    public void AddToList<TList, TItems>(TList inputList, params TItems[] itemsToAdd)
        where TItems : IConvertible
        where TList : IEnumerable<TItems>

    {
        IEnumerable<IConvertible> someOtherList;

        // Sounds good, doesn't work..
        //someOtherList = inputList;

        // This works
        someOtherList = (IEnumerable<IConvertible>)inputList;
    }
}

我希望inputList 可以直接分配给IEnumerable&lt;IConvertible&gt; someOtherList,但它需要一个演员表。为什么需要演员表?

【问题讨论】:

  • IList&lt;T&gt; 是不变的,所以IList&lt;TItems&gt; 不是IList&lt;IConvertible&gt;
  • 我刚刚发现someOtherList = (IList&lt;IConvertible&gt;)inputList; 会抛出运行时异常,即使我将TList 约束更改为协变的IEnumerable&lt;TItems&gt;
  • 您需要在TItems 中添加class 约束,以便someOtherList = inputList 进行编译。当元素类型为结构时,不支持方差。
  • @Chris,这是我在这里的第一个问题。下次会更好:)感谢您的cmets,我不知道可以看到编辑..

标签: c# .net list generics


【解决方案1】:

协方差仅适用于类,不适用于结构 (Source)。

因此,如果您将 TItems 限制为引用类型,您的代码将编译 (fiddle):

    where TItems : class, IConvertible

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多