代码之家  ›  专栏  ›  技术社区  ›  Noel Kennedy

为什么不能将受约束的open泛型类型转换为受约束的类型?

  •  5
  • Noel Kennedy  · 技术社区  · 14 年前

    我想我一定遗漏了什么,为什么我不能编译这个:

    class Foo<T> where T : Bar
    {
        T Bar;
    }
    
    abstract class Bar
    { }
    
    class MyBar : Bar
    { }
    
    static void Main(string[] args)
    {
        var fooMyBar = new Foo<MyBar>();
        AddMoreFoos(fooMyBar);
    }
    
    static void AddMoreFoos<T>(Foo<T> FooToAdd) where T : Bar
    {
        var listOfFoos = new List<Foo<Bar>>();
        listOfFoos.Add(FooToAdd); //Doesn't compile
        listOfFoos.Add((Foo<Bar>)FooToAdd); //doesn't compile
    }
    
    2 回复  |  直到 14 年前
        1
  •  9
  •   Jon Skeet    14 年前

    // This won't compile
    Foo<Bar> fooBar = new Foo<MyBar>();
    

    考虑到它不能编译,所以不能添加 Foo<MyBar> List<Foo<Bar>>

    那为什么不是 Foo<我的酒吧> Foo<Bar>

    IEnumerable<MyBar> x = new List<MyBar>();
    IEnumerable<Bar> y = x;
    

    但你做不到:

    IList<MyBar> x = new List<MyBar>();
    IList<Bar> y = x;
    

    NDC 2010 video site -只需搜索“方差”。

        2
  •  2
  •   Dan Puzey    14 年前

    Foo<int> 然后调用将失败:您正在尝试为泛型参数假定特定类型。

    你需要的是 var listOfFoos = new List<Foo<T>>() 取而代之的是 Add 应该有用。

    (编辑:同样,如果你使用 Foo<T> T Bar ).