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

C# 泛型方法签名和标准签名相同,c#,generics,overloading,C#,Generics,Overloading,假设您有一个类,其中包含使用T的方法,并且您还有同名的标准方法 如果T与标准方法的类型相同,会发生什么情况?调用标准方法 有没有办法强迫他调用T方法 使用制度 namespace ConsoleApplication3 { class Program { static void Main() { Generics<Int32> anInt = new Generics<Int32>(4); Generics<Strin

假设您有一个类,其中包含使用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;
    }
}
}
命名空间控制台应用程序3
{
班级计划
{
静态void Main()
{
仿制药anInt=新仿制药(4);
仿制药aString=新仿制药(“测试”);
}
}
公共类泛型
{
公共事务委员会成员;
公共字符串错误消息;
公共仿制药(T成员)
{
这个.成员=成员;
}
公共泛型(字符串错误消息)
{
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 };
    }
}
公共类泛型
{
公共事务委员会成员;
公共字符串错误消息;
公共仿制药(T成员)
{
这个.成员=成员;
}
私有仿制药()
{
//空构造函数只允许类在内部创建自己
}
公共静态泛型FromError(String errorMessage)
{
返回新的泛型{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");
}
静态泛型测试(T参数测试){
返回新的泛型(parameterToTest);
}
静态void Main()
{
泛型ANIT=测试(4);
仿制药aString=测试(“测试”);
}
我只是这样做了(针对这个特定案例):

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

    protected Generics() { }
然后我推导了T=string的具体情况

    public class GenericsOfString : Generics<String>
    {
        public GenericsOfString(String text, Boolean isErrorMessage)
        {
            if (isErrorMessage)
            {
                this.ErrorMessage = text;
            }
            else
            {
                this.Member = text;
            }
        }
    }
公共类泛型字符串:泛型
{
公共GenericsOfString(字符串文本、布尔isErrorMessage)
{
如果(iErrorMessage)
{
this.ErrorMessage=文本;
}
其他的
{
这个.成员=文本;
}
}
}

您签出了吗?如果您知道已经存在一个同名的方法,您应该重命名您的方法,想象一下另一个程序员继承了您的代码。谢谢,sq33G,现在我知道如何绕过它了。我觉得我的情况有点不同。我从泛型派生并编写了正确处理它的构造函数。@说这是一个构造函数,重命名不完全是一个选项。。)不要像这样在泛型构造下创建统一方法的类型。最初,这在版本2中是非法的。这是一种导致实现定义行为的错误做法。