在C#中使用List <T>(泛型)

mak*_*chi 26 c# generics

这是一个非常基本的问题,但我以前从未研究过仿制药,我发现自己需要使用它.不幸的是,我现在没时间通过任何教程,到目前为止我找到的相关问题的答案并不是人们可以称之为基本的,所以我们去:

假设我有以下内容:

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

if (someCondition)
    MyMethod(list1);
else
    MyMethod(list2);
Run Code Online (Sandbox Code Playgroud)

而且当然

void MyMethod(List<T> list){
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

好吧,我认为这很简单,但显然不是.VS警告我

无法从用法推断出方法MyMethod(System.Collections.Generic.List)的类型参数

无论如何,如果我编译它,我会得到一个

找不到类型或命名空间名称"T"

错误.

在我找到的许多答案中,我读到我必须声明什么T是有意义的,但是我不能完全理解如何在如此简单的场景中这样做.当然,那些答案在我的脑海中创造了更多的问题,但是现在我只想解释一下我做错了什么(除了不研究泛型)以及如何使它正确.

mat*_*mmo 42

您需要声明T该方法,然后C#可以识别该方法正在接收的类型.试试这个:

void MyMethod<T>(List<T> list){
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

然后通过这样做来调用它:

if (someCondition)
    MyMethod(list1);
else
    MyMethod(list2);
Run Code Online (Sandbox Code Playgroud)

如果要传递给方法的所有类共享一个公共基类,则可以使其更加严格:

void MyMethod<T>(List<T> list) where T : MyClassBase
Run Code Online (Sandbox Code Playgroud)

  • C#将基于参数推断出类型,因此在这种情况下不需要显式指定<MyClass1> - 显然如果方法上没有参数,则需要指定泛型参数 - 但是当它们被推断时它们很好! (3认同)
  • 所有答案都有效,我选择了这个作为最完整的答案(包括@Charleh 评论和后续更新)。谢谢你们。 (2认同)

Chr*_*tle 13

您需要将泛型类型参数添加T到您的方法:

void MyMethod<T>(List<T> list) {
Run Code Online (Sandbox Code Playgroud)

T否则,编译器不知道代表什么.


Roy*_*del 7

你需要让c#知道发送了什么类型:

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
}
Run Code Online (Sandbox Code Playgroud)