【问题标题】:Generics method signature and standard signature identical泛型方法签名和标准签名相同
【发布时间】:2013-06-05 03:14:31
【问题描述】:

假设你有一个类,它有使用 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;
    }
}
}

【问题讨论】:

  • 你检查this了吗?
  • 如果你知道已经存在同名方法,你应该重命名你的方法,想象另一个程序员继承你的代码。
  • 谢谢,sq33G,现在我知道如何规避它了。我的情况有点不同。我从 Generics 派生并编写了正确处理它的构造函数。
  • @Sayse 这是一个构造函数,重命名并不完全是一个选项。 ;)
  • 不要像这样在泛型构造下创建统一方法的类型。最初这将在版本 2 中被定为非法。这是一种不好的做法,会导致实现定义的行为。

标签: c# generics overloading


【解决方案1】:

抱歉,没有。

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

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

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

【讨论】:

    【解决方案2】:

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

    首先,不要这样做。不要。您希望人类能够阅读您的代码,而不仅仅是计算机。 (在那里,我已经尽到了作为 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");
    }
    

    【讨论】:

      【解决方案3】:

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

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

          protected Generics() { }
      

      然后我针对T = string的具体情况推导出来

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        相关资源
        最近更新 更多