我正在阅读深度书中的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>
答案 0 :(得分:2)
我认为你的混淆源于这样一个事实:名称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
,可能是泛型类型该类的参数。这将向您展示泛型类的方法如何添加自己的泛型类型参数,以及与声明方法的类的泛型类型参数一起使用。
答案 1 :(得分:1)
TOutput
是type参数,它指定返回的List中使用的类型。如果没有泛型类型参数,则必须执行以下操作:
List<object> ConvertAll(Converter<T, object> converter)
显然,对某些特定类型的东西来说,这是一个极其糟糕的替代品。
答案 2 :(得分:1)
部分
<TOutput>
指定在代码中使用该方法时提供的类型。你可以写一些例如
var result = ConvertAll<int>(converter);
使用该方法。
这可以防止为每种可能的返回类型创建单独的方法,其中只有返回类型不同。
我故意使用上面的var
关键字来说明<int>
之后的ConvertAll
指定了编译器“插入”泛型方法定义的类型。这是代码的一部分,您可以在其中创建泛型方法具体(意味着您指定要使用的具体类型)。
<强>更新强>
正如我的评论中所提到的,这是一个带有一个不用于返回类型的类型参数的方法。
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
答案 3 :(得分:1)
这是泛型类中的通用方法。
通常,类型或方法的名称后面会给出泛型类型或方法的类型参数列表。检查以上内容:
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
&#39; s T
参数,所以泛型方法调用的有效签名是:
List<double> ConvertAll(Converter<int, double> converter)
在许多情况下,编译器会根据参数返回的类型为您计算出类型参数,因此您可以经常跳过显式说明符,如下所示:
List<double> converted = intlist.ConvertAll(i => (double)i);
泛型方法使您可以灵活地指定任何类型的转换,而List<T>
类不需要为其提供显式处理程序。就像您可以创建任何类型的List
一样,您可以使用任何输出类型将转换函数传递给ConvertAll
,并且它会愉快地为您处理它,返回适当类型的{{1} }}