32

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

假设我有以下内容:

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”

错误。

在我找到的许多答案中,我读到我必须声明什么T是有道理的,但在如此简单的场景中我无法完全掌握如何做到这一点。当然,这些答案在我的脑海中产生了更多的问题,但现在我只想解释我做错了什么(除了不研究泛型)以及如何改正。

4

4 回答 4

48

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

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

然后通过以下方式调用它:

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

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

void MyMethod<T>(List<T> list) where T : MyClassBase
于 2013-10-02T14:13:50.003 回答
14

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

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

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

于 2013-10-02T14:14:07.130 回答
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
}
于 2013-10-02T14:13:55.103 回答
1

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

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

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

于 2017-06-28T05:41:42.163 回答