C# - 如何为T和T []应用不同的泛型方法

时间:2010-12-16 14:51:33

标签: c# generics

我有大量不同内置类型的对象,例如: 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 [])'不可能   从用法推断。尝试   指定类型参数   明确。

如何优雅地解决这个问题?

3 个答案:

答案 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[]