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

本文关键字:泛型方法 标准 | 更新日期: 2023-09-27 18:17:28

假设您有一个类,其中有使用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;
    }
}
}

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

对不起,没有。

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

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

我个人会将这两个构造函数都改为静态方法,这样在行为上的区别对用户来说是绝对清楚的。但是,如果您只更改一个构造函数,则将其设置为错误构造函数。

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

首先,不要这样做。不。你希望人类能够读懂你的代码,而不仅仅是电脑。(在这里,我已经完成了作为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");
}

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

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

    protected Generics() { }

然后我推导出T = string

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