【问题标题】:In C#, What is <T> After a Method Declaration?在 C# 中,方法声明后的 <T> 是什么?
【发布时间】:2010-04-30 15:52:03
【问题描述】:

我是一个 VB.Net 人。 (因为我必须这样做,因为签署我支票的人是这样说的。:P)我是在 Java 中长大的,当我有机会时,我通常不会在 C# 中阅读或写作。我今天遇到了一些我从未见过的语法,而且我似乎无法弄清楚。

下面的方法声明中,代表什么?

static void Foo (params T[] x)

我已经看到与声明泛型集合和事物结合使用,但我一生都无法弄清楚它对这种方法有什么作用。

以防万一,我在考虑一些C# brain teasers 时遇到了它。第六个预告片包含整个代码 sn-p。

【问题讨论】:

    标签: c# methods declaration


    【解决方案1】:

    您要问的是 c# 中泛型的概念。通过使用泛型,您可以将此方法用于您想要的类型

    假设您必须创建一个函数来添加两个数字。 在这种情况下,您的功能是

    //For integer :
    public int sum(int a, int b)
    { 
      return a + b;
    }
    
    
    
    //For floating point numbers :
    public float sum( float a, float b)
    {
      return a + b;
    }
    

    按照这个逻辑,如果你想要一个函数来对两个双精度类型数字求和,你可以再创建一个函数,依此类推。

    注意: 上面的代码不适用于 C#,但它可以方便地解释概念,它只是 sudo 代码,如果您很容易具有可空类型或引用类型或需要编写,它将适用于 C#将值转换为主要类型的逻辑。

    在泛型的帮助下,您可以替换所有这些函数并编写以下内容,

    public T sum<T>(T a, T b)
    {
      return a + b;
    }
    

    这适用于所有数字类型以及字符串。

    查看更多详情:http://www.codeproject.com/kb/books/EssentialCS20.aspx

    【讨论】:

    【解决方案2】:

    这定义了一个generic method,它是generics 的一种形式,在C# 2.0 中被添加到C# 中。

    方法sig应该是:

    static void Foo<T>(params T[] x)
    { // ...
    

    这使您可以将任意数量的任何(特定)类型的参数传递给方法 Foo,它会作用于该参数数组。它类似于泛型类型的工作方式,只是范围仅限于方法。 &lt;T&gt; 指定传递给方法的参数的类型,因此您可以这样调用:

    Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
    

    【讨论】:

    • 具体来说,它定义了方法中泛型类型使用的名称(或多个名称)。
    • 我的理解是,在这段代码中,(params T[] x) 负责声明该方法接受任意数量的T类型参数,并将它们存储在x引用的数组中。如果正确的话,方法名后面的在声明中添加了什么?
    • @Drew:您声明了要在函数中使用的类型。编译器不知道T[] 是什么意思,因为没有类型T,它是用&lt;T&gt; 声明的。作为函数的调用者,您可以设置类型。例如Foo&lt;int&gt;(1, 2, 3);Foo&lt;float&gt;(1.0, 2.0, 3.0);
    • @Drew:就像变量声明一样,你可以使用任何你想要的名字。你也可以写:static void Foo&lt;Bar&gt;(params Bar[] x) { }。例如,将TTKeyTValue 用于字典只是一种约定。
    • @Drew:还要注意,调用函数时可以省略&lt;T&gt;,只要它可以被编译器推断出来。例如,Foo(new Bar(), new Bar()) 等价于 Foo&lt;Bar&gt;(new Bar(), new Bar())。编译器无法确定它应该使用什么类型的一个例子可能是在传递多个具有公共基类型或匿名方法的不同类型的对象时。
    【解决方案3】:

    T 是type parameter,在这种情况下可以是任何东西(可以指定约束,但这里没有约束)。如果没有此功能,您将不得不为您计划使用的每种类型声明方法:

    static void Foo(params int[] x)    
    static void Foo(params string[] x)    
    static void Foo(params Customer[] x)    
    etc...
    

    更多关于泛型的信息可以在 MSDN 上找到:Introduction to Generics (C#)

    【讨论】:

    【解决方案4】:

    这是泛型方法的泛型类型参数。

    一旦在调用方法时为 T 指定了类型,.NET 就可以根据该类型参数确保类型安全。

    static void Foo<T>(params T[] x) { }
    

    会被称为:

    string[] names = new string[] {"Foo", "Bar", "Baz"};
    
    Foo<string>(names);
    

    但这会导致编译器错误:

    int[] nums = new int[] {1, 2, 3};
    
    Foo<string>(nums); // nums is not string[]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多