C#派生类型到通用列表作为参数

时间:2010-09-05 19:39:57

标签: c# generics list parameters

我正在尝试在C#4.0中执行以下操作:

我有一个基类和2个派生类


public class Base {}
public class DerivedClass1 : Base {}
public class DerivedClass2 : Base {}

我想做这样的事情,但它不起作用。

如何告诉通用列表接受基类和基类的派生类。


public class Class_1
{
    public Class_1()
    {
        List<DerivedClass2> list = new List<DerivedClass2>();
        new Class_2(list);
    }
}

public class Class_2
{
    public Class_2(List<Base> list)
    {

    }
}

在Java中我可以做这样的事情


public class Class_2
{
    public Class_2(List<? extends Base> list)
    {

    }
}

C#

中是否存在类似的内容

我希望我的问题很明确,只是关于列表的泛型。

非常感谢提前:)

2 个答案:

答案 0 :(得分:3)

一般情况:

function Foo<T>(List<T> list) where T : Base {
   ...
}

加上接口和代理,C#允许共同/逆转。

例如IEnumerable<T>IList<T>,您的代码将有效!请注意,如果List<T>允许这样做,您可以使用公共基类将Derived1插入Derived2列表中,这会破坏类型安全性。所以简单地坚持上面的readonly接口。

答案 1 :(得分:2)

我认为你的意思是:

// Define other methods and classes here
public class Class_1
{
    public Class_1()
    {
        List<DerivedClass2> list = new List<DerivedClass2>();
        new Class_2<DerivedClass2>(list);
    }
}

public class Class_2<T> where T : Base
{
    public Class_2(List<T> list)
    {

    }
}

或者,如果您希望构造函数是通用的,而不是类:

// Define other methods and classes here
public class Class_1
{
    public Class_1()
    {
        List<DerivedClass2> list = new List<DerivedClass2>();
        Class_2.Create(list);
    }
}

public class Class_2
{
    public static Class_2 Create<T>(List<T> list) where T : Base
    {
        // Stuff
        return new Class_2(/*Stuff*/);
    }

    public Class_2()
    {

    }
}