理解Generic方法的语法

时间:2014-04-22 01:05:49

标签: c# generics

我正在阅读深度书中的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>

中没有说明/为什么

4 个答案:

答案 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;
}

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

答案 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已替换类型参数TOutputintList&#39; s T参数,所以泛型方法调用的有效签名是:

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

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

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

泛型方法使您可以灵活地指定任何类型的转换,而List<T>类不需要为其提供显式处理程序。就像您可以创建任何类型的List一样,您可以使用任何输出类型将转换函数传递给ConvertAll,并且它会愉快地为您处理它,返回适当类型的{{1} }}