泛型方法签名和标准签名相同

时间:2013-06-09 07:27:32

标签: c# generics overloading

假设你有一个使用T的方法的类。你也有相同名称的标准方法。

如果T与标准方法的类型相同,会发生什么?调用标准方法。

有没有办法强迫他打电话给T-method?

使用System;

namespace ConsoleApplication3
{
class Program
{
    static void Main()
    {
        Generics<Int32> anInt = new Generics<Int32>(4);
        Generics<String> aString = new Generics<String>("test");
    }
}

public class Generics<T>
{
    public T Member;

    public String ErrorMessage;

    public Generics(T member)
    {
        this.Member = member;
    }

    public Generics(String errorMessage)
    {
        this.ErrorMessage = errorMessage;
    }
}
}

3 个答案:

答案 0 :(得分:5)

抱歉,没有。

最简单的解决方案是使用两个不同的方法名称来指示行为的差异。由于所讨论的方法名称是构造函数,因此您无法控制名称,因此必须将其中至少一个更改为普通方法。例如:

public class Generics<T>
{
    public T Member;

    public String ErrorMessage;

    public Generics(T member)
    {
        this.Member = member;
    }

    private Generics()
    {
        // empty constructor just to allow the class to create itself internally
    }

    public static Generics<T> FromError(String errorMessage)
    {
        return new Generics<T> { ErrorMessage = errorMessage };
    }
}

就个人而言,我会将两个构造函数都更改为静态方法,以便对用户完全清楚行为的差异。但是,如果只更改一个构造函数,请将其设为错误。

答案 1 :(得分:1)

好的,我会对答案进行评论。

首先,不要这样做。不要。您希望人类能够读取您的代码,而不仅仅是计算机。 (在那里,我已经完成了作为C#程序员空间成员的职责)

第二

如上所述here

如果您设计代码以便编译器无法确定何时编译您正在调用的类型,则可以强制它使用泛型方法。

static Generics<T> Test<T> (T parameterToTest) {
    return new Generics<T>(parameterToTest);
}

static void Main()
{
    Generics<Int32> anInt = Test<Int32>(4);
    Generics<String> aString = Test<String>("test");
}

答案 2 :(得分:0)

我只是这样做(对于这个具体案例):

我在Generics中添加了一个空的受保护构造函数

    protected Generics() { }

然后我导出了T = string

的具体情况
    public class GenericsOfString : Generics<String>
    {
        public GenericsOfString(String text, Boolean isErrorMessage)
        {
            if (isErrorMessage)
            {
                this.ErrorMessage = text;
            }
            else
            {
                this.Member = text;
            }
        }
    }