在C#(Generics)中使用List <t> </t>

时间:2013-10-02 14:11:16

标签: c# 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”

错误。

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

4 个答案:

答案 0 :(得分:38)

您需要针对该方法声明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

答案 1 :(得分:13)

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

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

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

答案 2 :(得分: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
}

答案 3 :(得分:1)

基本上,在C#中,Template.SocialMedia.helpers({ getSocialMediaIconTooltip: function(service) { try { const smsdata = socialMediaSystem.findOne({subname: service}); if (smsdata.active == false) return smsdata.tooltip; else { const smudata = socialMediaUser.findOne({accountId: Meteor.user()._id, service: service}); if (smudata) return "Disconnect " + smsdata.tooltip; else return "Connect " + smsdata.tooltip; } } catch(ex) { console.error(ex); } }, 类表示可以通过索引访问的强类型对象列表。

它还支持存储特定类型的值,而无需在对象之间进行强制转换。

我们可以使用Interger值&amp;列表中的字符串值。