2014-04-22 166 views
1

我读C#中深度的书,这里理解语法的例子:当他被解剖他的榜样,他也说ConvertAll<TOutput>的泛型方法

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

我不明白,这部分:"The method's name is ConvertAll and it has a single param of Converter<T, TOutput>

见还是不说什么/为什么在ConvertAll<TOutput>

回答

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, ...) 

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

1

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

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

显然,这对于某些特定类型的东西来说是非常差的替代品。

+0

但是没有列出它自己有一个?那么还不足以说明它的类型吗? – ConfusedSleepyDeveloper

+0

'List '只消耗该方法声明的泛型类型。该通用类型的实际声明在'ConvertAll '中。 –

+1

其实,这就是你如何使用'ConvertAll'。请参阅[MSDN]中的示例(http://msdn.microsoft.com/zh-cn/library/73fe8cwf%28v=vs.110%29.aspx)。你不需要指定类型,因为它可以通过参数来推断(类型'Convert ' –

1

的部分

<TOutput> 

指定时要使用的方法中的代码被提供一个类型。你可以写例如

var result = ConvertAll<int>(converter); 

要利用该方法。

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

我有意使用上面的var关键字来说明在ConvertAll之后的<int>指定了一个类型,该类型被编译器“放入”到通用方法定义中。这是你的代码的一部分,你的通用方法具体(意思是指定具体的使用类型)。

UPDATE

正如我在评论中提及,这里是一个方法,与采用未使用的返回类型的类型参数。

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

+0

所以它是该方法的“返回类型”? – ConfusedSleepyDeveloper

+0

在我给出的例子中,“返回类型”是“List ”因为我指定了类型“int”,“int”是“放在方法定义中出现TOutput的地方。 –

+0

所以我的困惑是这样的:我们已经告诉方法,它的返回类型是列表,它在代码中可以是int,double等。我们还告诉方法,它的输入是我们通过的转换器参数。一个方法有一个输入和一个输出,那么额外的在那里做什么? :D – ConfusedSleepyDeveloper

1

这是泛型类中的泛型方法。

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

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

在此实例中,类型参数位于方法名称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) 

在许多情况下,编译器会根据参数返回的类型找出您的类型参数R,所以你可以经常跳过明确说明符这样的:

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

通用方法,使您能够灵活而不List<T>类需要有明确的处理程序为它指定任何类型的转换。就像您可以创建任何类型的List一样,您可以将任何输出类型的转换函数传递到ConvertAll,并且会很乐意为您处理它,并返回适当类型的List