有没有办法在C#中完成List <object> list = new List <int>()之类的东西?

dev*_*ium 2 c# generics

就是那个问题.我想要完成的是类似于以下Java代码:

class A { }
class B extends A { }

public class Tests {
    public static void main(String [] args) {
        ArrayList<? extends A> lists = new ArrayList<B>(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

(其中B extends AB继承自A)

有可能吗?

谢谢

Ada*_*son 7

不是.虽然C#4.0引入了接口的方差概念,但它并不是(也不可能)做你特别要求的.

在C#4.0中,您可以这样做:

IEnumerable<object> foo = new List<int>();


编辑:正如Marc所指出的,这不能用值类型和引用类型来完成.但是,由于我认为你的问题更多的是关于一个概括而A:B不是关于它的问题int:object,我认为这个问题具有重要意义.是准确的,不过,我的意思是,C#4.0将允许一些这样:

IEnumerable<object> foo = new List<string>();
Run Code Online (Sandbox Code Playgroud)

但你无法做你所描述的.也就是说,让我们考虑一下:

List<int> foo = new List<int>();
List<object> bar = foo;

bar.Add("baz");
Run Code Online (Sandbox Code Playgroud)

现在,当我们尝试访问时会发生什么foo[0]?您现在已经破坏了列表中的类型安全性.

  • @devoured elysium:在C#4中,某些*接口可能存在泛型差异* - 从一个泛型类到另一个泛型类永远不可能.那么你在C#4中可以做的就是:`IEnumerable <A> list = new List <B>();` (2认同)
  • 方差不会在ref-types和value-types之间扩展.它适用于`IEnumerable <object> foo = List <string>`,但不适用于`int`. (2认同)