Lambda表达式(如何定义扩展函数?)

时间:2011-07-10 19:07:21

标签: c# extension-methods lambda

var numbers=new int[]{1,2,3};
var numbers1=numbers.Select(n=>n);
var numbers2=numbers.Select(n=>n.ToString());
var numbers3=numbers.Select(n=>new {Number=n, Even=n%2==0});

扩展函数SELECT的输出怎么可能是任何类型的?

3 个答案:

答案 0 :(得分:5)

这是使用以下签名定义的generic扩展方法:

public static IEnumerable<Tresult> Select<TSource, TResult>(
                this IEnumerable<TSource> source, 
                Func<TSource, TResult> selector);

使用source和selector参数中的类型信息,编译器可以推断出使用的类型,因此您无需为其明确命名。

答案 1 :(得分:1)

此处Select的特定版本采用Func<T, TResult>选择器,其中T是输入的类型(在本例中为int),{{1是输出。根据您的lambda表达式,编译器能够推断出TResult的类型。在您的情况下,类型是

  • INT
  • 字符串
  • 匿名

如果您对这些匿名功能感到好奇,我建议您查看C# 4.0 language specification,可能从第7.15节开始。

答案 2 :(得分:1)

IEnumerable.Selectgeneric method,其中包含以下签名:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, TResult> selector
)

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, int, TResult> selector
)

传入的函数必须返回TResultSelect本身返回IEnumerable<TResult>TResult的类型可以由编译器推导出来(如帖子中所做的那样),也可以明确注释。

有关泛型的更多信息 - 例如TResult可以是“任意但特定类型”,可以在C# Generics Programming Guide找到。有许多SO问题也讨论了C#类型推断的限制(包括泛型的推断)。

快乐的编码。