Использование 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
есть, что имеет смысл, но я не мог понять, как это сделать в таком упрощенном сценарии. Конечно, эти ответы породили еще больше вопросов, но сейчас я просто хочу объяснить, что я делаю неправильно (кроме того, не изучая дженерики) и как сделать это правильно.
Ответы
Ответ 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 в списке.