了解泛型方法的语法
本文关键字:语法 泛型方法 了解 | 更新日期: 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
替换,并且 int
是List
的 T
参数,因此泛型方法调用的有效签名为:
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