Подтвердить что ты не робот

Использование List <T> в С# (Generics)

Это довольно элементарный вопрос, но я никогда раньше не делился с дженериками, и я оказался в необходимости использовать его. К сожалению, у меня нет времени прямо сейчас, чтобы пройти какие-либо учебники, и ответы, которые я нашел связанным вопросам, до сих пор не являются тем, что можно назвать базовыми, так что мы идем:

Скажем, у меня есть следующее:

List<MyClass1> list1 = getListType1();
List<MyClass2> list2 = getListType2();

if (someCondition)
    MyMethod(list1);
else
    MyMethod(list2);

И, конечно,

void MyMethod(List<T> list){
    //Do stuff
}

Ну, я думал, это будет так просто, но, видимо, это не так. VS предупреждает меня, что

Аргументы типа для метода MyMethod (System.Collections.Generic.List) не могут быть выведены из использования

и если я его скомпилирую, я получаю

Невозможно найти имя типа или пространства имен

ошибка.

В многочисленных ответах, которые я нашел, я читал, что я должен объявить, что T есть, что имеет смысл, но я не мог понять, как это сделать в таком упрощенном сценарии. Конечно, эти ответы породили еще больше вопросов, но сейчас я просто хочу объяснить, что я делаю неправильно (кроме того, не изучая дженерики) и как сделать это правильно.

4b9b3361

Ответ 1

Вам нужно объявить T против метода, тогда С# может определить тип, который получает метод. Попробуйте следующее:

void MyMethod<T>(List<T> list){
    //Do stuff
}

Затем вызовите его, выполнив:

if (someCondition)
    MyMethod(list1);
else
    MyMethod(list2);

Вы можете сделать это еще более строгим, если все классы, которые вы собираетесь передать методу, имеют общий базовый класс:

void MyMethod<T>(List<T> list) where T : MyClassBase

Ответ 2

Вам нужно добавить общий тип параметра T к вашему методу:

void MyMethod<T>(List<T> list) {

Компилятор не знает, что представляет T, в противном случае.

Ответ 3

Вам нужно дать С# знать, какой тип отправлен:

List<MyClass1> list1 = getListType1();
List<MyClass2> list2 = getListType2();

if (someCondition)
    MyMethod<MyClass1>(list1);
else
    MyMethod<MyClass2>(list2);

void MyMethod<T>(List<T> list){
    //Do stuff
}

Ответ 4

В принципе, в С# класс List < T > представляет собой строго типизированный список объектов, к которым можно получить доступ по индексу.

И он также поддерживает сохранение значений определенного типа без каста на объект или из него.

мы можем использовать значение Interger и String Value в списке.