【问题标题】:How to set a default type for T in a static generic method?如何在静态泛型方法中为 T 设置默认类型?
【发布时间】:2020-02-10 18:23:08
【问题描述】:

我正在使用我自己的自定义堆栈类,并且我正在尝试创建一个通用方法来创建一个新堆栈(一个通用对象)。我经常使用 int 类型的堆栈,只是偶尔需要其他类型。我可以将 T 的默认类型设置为 int 吗?

方法如下:

public static Stack<T> newStack<T>(int length)
{
    Stack<T> s = new Stack<T>();
    for (int i = 0; i < length; i++)
    {
        Console.WriteLine("print num");
        string input = Console.ReadLine();
        T value = (T)Convert.ChangeType(input, typeof(T));
        s.Push(value);
    }
    return s;
}

我想用这样的方法:

newStack(5);//defult int type

对于任何其他类型

newStack<string>(5)

有人可以帮忙吗?谢谢。

【问题讨论】:

  • a few old questions 说你不能,但我不知道事情是否发生了变化。那里的建议是制作另一种没有泛型参数的方法,只调用 int 版本。

标签: c# generics


【解决方案1】:

您不能为 T 指定默认类型,但是您可以简单地重载 newStack 方法来获得您想要的行为。重载的方法将自动创建一个int 类型的新堆栈。

您的代码将如下所示:

public static Stack<T> newStack<T>(int length)
{
    Stack<T> s = new Stack<T>();
    for (int i = 0; i < length; i++)
    {
        Console.WriteLine("print num");
        string input = Console.ReadLine();
        T value = (T)Convert.ChangeType(input, typeof(T));
        s.Push(value);
    }
    return s;
}

public static Stack<int> newStack(int length)
{
    // Call our original new stack method but pass
    // integer as the type T
    return newStack<int>(length);
}

现在,如果您只想像这样创建一个整数类型的新堆栈,则可以调用第二种方法:

newStack(5);

否则,您可以使用以下方法创建其他类型的堆栈:

newStack<string>(5);

【讨论】:

  • 很好的答案。你先回答,所以我会接受你的回答
【解决方案2】:

添加一个没有泛型的方法 newStack:

 public static Stack<int> newStack(int length) => newStack<int>(length);

编译器足够聪明,可以选择正确的方法。

【讨论】:

    【解决方案3】:

    您可以忍受通用形式,并在需要时使用 int 类型:

    Stack<int> myStack = newStack<int>(5);
    

    但如果你真的想要,你可以定义另一个不带类型参数的方法来调用泛型版本:

    public static Stack<int> newStack(int length)
    {
        return newStack<int>(length);
    }
    
    Stack<int> myStack = newStack(5);
    

    【讨论】:

      【解决方案4】:

      简短的回答,你不能,但你可以使用非泛型重载:

      public static Stack<int> newStack(int length)
      {
          return newStack<int>(length);
      }
      

      【讨论】:

        【解决方案5】:

        我认为你可以使用重载。

        public static Stack<int> newStack(int length)
        {
             return newStack<int>(length);
        }
        

        【讨论】:

          猜你喜欢
          • 2016-04-22
          • 2014-07-06
          • 1970-01-01
          • 2021-06-28
          • 2012-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多