我有大量不同内置类型的对象,例如: int,bool [],double []等。
在对象M上,我想对集合的每个元素执行一次MyMethod操作。但是,我需要对数组执行不同的操作,并且需要使用单个值执行不同的操作。
首先,我试过了:
public void MyMethod<T>(T value)
public void MyMethod<T>(T[] array)
然后,第一个方法应用于集合的每个元素,包括数组。
我的下一次尝试是:
public void MyMethod<T>(T value) where T : struct
public void MyMethod<T>(T[] array)
当我尝试调用该方法时,它有以下效果:
错误8类型'T'必须是非可空值类型才能在泛型类型或方法'MyMethod(T)'
中将其用作参数'T'
似乎编译器没有看到 MyMethod(T [] array)方法。 我哪里错了?
最后,我提供了一个辅助方法:
public void MyAux<T>(T value) {
if (value.GetType().IsArray) {
this.MyMethodForArray(value);
}
else {
this.MyMethodForSingleValue(value);
}
然后我收到了一个错误:
错误8方法的类型参数 'MyMethodForArray(T [])'不可能 从用法推断。尝试 指定类型参数 明确。
如何优雅地解决这个问题?
答案 0 :(得分:5)
如果这样做会有伤害,请不要这样做。您会注意到框架中的List数据类型具有Add和AddRange方法。采用项目和采用项目集合的方法的方法在逻辑上是不同的,因此给它们提供不同的名称是有意义的。而不是打击你的类型系统,只需更改其中一个的名称。
答案 1 :(得分:4)
创建如下的简单程序
class Program
{
static void Main(string[] args)
{
Foo t = new Foo();
// Line numbering for convenience
t.MyMethod<bool>(true); // #1
t.MyMethod<bool>(new bool[] { true }); // #2
t.MyMethod<bool[]>(new bool[] { true }); // #3
}
}
public class Foo
{
public void MyMethod<T>(T value)
{
Console.WriteLine("Single element method called");
}
public void MyMethod<T>(T[] array)
{
Console.WriteLine("Array method called");
}
}
输出将是:
Single element method called
Array method called
Single element method called
我怀疑你在方法#3中调用了方法,你计划在第2行调用它。请注意,差异在两个额外的方括号中。
答案 2 :(得分:3)
只有一个版本的函数(数组版本),但是使用params
关键字声明它,如下所示:
public void MyMethod<T>(params T[] array)
您可能会探索的其他内容是使用IEnumerable<T>
而不是T[]