了解泛型方法的语法

本文关键字:语法 泛型方法 了解 | 更新日期: 2023-09-27 17:59:20

我正在阅读C#深入的书,下面是一个例子:

List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter)

我不明白这部分:ConvertAll<TOutput>

当他剖析他的例子时,他还说:"The method's name is ConvertAll and it has a single param of Converter<T, TOutput>

看到它仍然没有说什么/为什么在ConvertAll<TOutput>

了解泛型方法的语法

我认为您的困惑源于这样一个事实,即名称TOutput出现在程序文本中的时间比其声明更早。

这是正在发生的事情 - 回想一下,定义常规方法的语法如下:

return_type method_name ( param1_type param1, param2_type param2, ... )

泛型方法在方法名称后添加尖括号:

method_name <gnenric_type_param1, generic_type_param2, ...> ( param1_type param1, param2_type param2, ... )

所以现在你的方法看起来像这样:

return_type ConvertAll<TOutput> ( param1_type param1, param2_type param2, ... )

返回类型是什么?这是List<TOutput>. TOutput来自尖括号中的类型参数,但它用于返回类型,即在尖括号之前

List<TOutput> ConvertAll<TOutput> ( param1_type param1, param2_type param2, ... )

声明的其余部分很简单:你只有一个参数,Converter<T, TOutput> converter,它使用方法的TOutput泛型类型参数,以及T,大概是类的泛型类型参数。这显示了泛型类的方法如何添加其自己的泛型类型参数,以便与声明该方法的类的泛型类型参数一起使用。

TOutput 是指定返回的列表中使用的类型的类型参数。如果没有泛型类型参数,则必须执行以下操作:

List<object> ConvertAll(Converter<T, object> converter)

显然,这是可以属于特定类型的东西的极差替代品。

这是

泛型类中的泛型方法。

通常,泛型类型或方法的类型参数列表在类型或方法的名称之后给出。 检查上述内容:

List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter)

在此实例中,type 参数位于方法名称 ConvertAll 之后。 调用ConvertAll时使用的任何类型都将用于确定结果类型。 这里的单个参数是一个函数,它接受T(列表中的项目类型(并返回一个TOutput。 这将针对列表中的每个项目运行,结果以新List<TOutput>返回。

下面是一个用法示例:

List<int> intlist = new List<int> { 1, 2, 3, 4, 5 };
List<double> converted = intlist.ConvertAll<double>(i => (double)i);

在这种情况下,类型double已被类型参数 TOutput 替换,并且 intListT 参数,因此泛型方法调用的有效签名为:

List<double> ConvertAll(Converter<int, double> converter)

在许多情况下,编译器会根据参数返回的类型为您找出类型参数,因此您通常可以跳过显式说明符,如下所示:

List<double> converted = intlist.ConvertAll(i => (double)i);

泛型方法使您可以灵活地指定任何类型的转换,而无需List<T>类为其提供显式处理程序。 就像您可以创建任何类型的List一样,您可以将转换函数传递给具有任何输出类型的ConvertAll,它会很乐意为您处理它,返回适当类型的List

零件

<TOutput>

指定要在代码中使用该方法时提供的类型。 例如,你可以写

var result = ConvertAll<int>(converter);

以使用该方法。

这样就不需要为每个可能的返回类型创建单独的方法,其中只有返回类型不同。

我特意使用了上面的 var 关键字来说明 ConvertAll 之后的<int>指定了一个由编译器"放入"泛型方法定义的类型。 这是代码中使泛型方法具体化(意味着指定要使用的具体类型(的部分。

更新

正如我的评论中提到的,这里有一个方法,它采用不用于返回类型的类型参数。

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

http://msdn.microsoft.com/en-us/library/twcad0zb.aspx