C # Производный тип в общий список в качестве параметра - PullRequest
1 голос
/ 05 сентября 2010

Я пытаюсь сделать следующее в 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 ]

3 голосов
/ 05 сентября 2010

Общий случай:

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

плюс для интерфейсов и делегатов, C # допускает ко / контравариантность.

Например, IEnumerable<T> и IList<T>, ваш код будет работать!Обратите внимание, что если бы это было разрешено для List<T> с, вы могли бы вставить Derived1 в список Derived2 с, используя общий базовый класс, что нарушило бы безопасность типов.Так что просто придерживайтесь вышеуказанных интерфейсов только для чтения.

2 голосов
/ 05 сентября 2010

Я думаю, что вы имеете в виду либо:

// 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()
    {

    }
}
...