这是一个非常基本的问题,但我以前从未研究过仿制药,我发现自己需要使用它。不幸的是我现在没时间通过任何教程,到目前为止我找到的相关问题的答案并不是人们所说的基本的,所以我们去了:
假设我有以下内容:
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
是什么,这是有道理的,但我无法理解如何在如此简单的场景中这样做。当然,这些答案在我的脑海中创造了更多的问题,但是现在我只想解释一下我做错了什么(除了不研究泛型)以及如何做到正确。
答案 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;列表中的字符串值。