使用列表<;T>;在C#(泛型)中

使用列表<;T>;在C#(泛型)中,c#,generics,C#,Generics,这是一个相当基本的问题,但我以前从未深入研究过泛型,我发现自己需要使用它。不幸的是,我现在没有时间阅读任何教程,我找到的相关问题的答案并不是人们所说的基本答案,因此我们开始: 假设我有以下几点: List<MyClass1> list1 = getListType1(); List<MyClass2> list2 = getListType2(); if (someCondition) MyMethod(list1); else MyMethod(lis

这是一个相当基本的问题,但我以前从未深入研究过泛型,我发现自己需要使用它。不幸的是,我现在没有时间阅读任何教程,我找到的相关问题的答案并不是人们所说的基本答案,因此我们开始:

假设我有以下几点:

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

if (someCondition)
    MyMethod(list1);
else
    MyMethod(list2);
List list1=getListType1();
List list2=getListType2();
如果(某些条件)
MyMethod(列表1);
其他的
MyMethod(列表2);
当然

void MyMethod(List<T> list){
    //Do stuff
}
void MyMethod(列表){
//做事
}
我原以为会这么简单,但显然不是。VS警告我

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

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

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

错误


在我找到的许多答案中,我读到我必须声明
T
是什么,这是有道理的,但我不太明白在这样一个简单的场景中如何做到这一点。当然,这些答案在我脑海中产生了更多的问题,但现在我只想解释一下我做错了什么(除了不学习泛型)以及如何纠正错误。

你需要声明
T
,然后C#可以识别方法接收的类型。试试这个:

void MyMethod<T>(List<T> list){
    //Do stuff
}
如果要传递给该方法的所有类都共享一个公共基类,则可以使其更加严格:

void MyMethod<T>(List<T> list) where T : MyClassBase
void MyMethod(列表),其中T:MyClassBase
您需要让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
}
List list1=getListType1();
List list2=getListType2();
如果(某些条件)
MyMethod(列表1);
其他的
MyMethod(列表2);
void MyMethod(列表){
//做事
}

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

void MyMethod<T>(List<T> list) {
void MyMethod(列表){
编译器不知道
t
表示什么,否则。

基本上,在C#中,
List
类表示可以通过索引访问的对象的强类型列表

它还支持存储特定类型的值,而无需向对象强制转换或从对象强制转换


我们可以在列表中使用整数值和字符串值。

首先,请确保包含using System.Collections.Generic;泛型。这不是泛型的工作方式。
MyMethod(列表列表)
是无效的方法签名(除非您的类是带有类型参数的泛型类
T
MyClass1
MyClass2
是否有一些共同的基类型或接口?它们是否共享许多共同的属性或方法?C#将根据参数推断类型,因此在这种情况下不需要显式指定-显然,如果方法上没有参数,则需要指定泛型参数-但它不是当他们被推断出来的时候,这很好!所有答案都有效,我选择了这一个作为最完整的答案(包括@Charleh评论和后续更新)。谢谢大家。
void MyMethod<T>(List<T> list) {