9

假设您有一个具有使用 T 的方法的类。并且您还有同名的标准方法。

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

有什么办法可以强制他调用T法吗?

使用系统;

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;
    }
}
}
4

3 回答 3

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 };
    }
}

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

于 2013-06-09T07:47:36.183 回答
1

好的,我会把我的评论变成一个答案。

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

第二。

如此处所述:

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

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");
}
于 2013-06-09T10:29:33.303 回答
0

我只是这样做了(对于这种特定情况):

我向泛型添加了一个空的受保护构造函数

    protected Generics() { }

然后我导出了 T = string 的特定情况

    public class GenericsOfString : Generics<String>
    {
        public GenericsOfString(String text, Boolean isErrorMessage)
        {
            if (isErrorMessage)
            {
                this.ErrorMessage = text;
            }
            else
            {
                this.Member = text;
            }
        }
    }
于 2013-06-09T10:44:46.093 回答