繁体   English   中英

Lambda 表达式(扩展 function Select 是如何定义的?)

[英]Lambda expressions (how is the extension function Select defined?)

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});

扩展 function SELECT 的 output 怎么可能是任何类型?

它是使用以下签名定义的通用扩展方法:

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

使用源和选择器参数中存在的类型信息,编译器可以推断使用的类型,因此您无需显式命名它。

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

  • 整数
  • 细绳
  • 匿名的

如果您对此类匿名函数感到好奇,我鼓励您查看C# 4.0 语言规范,可能从第 7.15 节开始。

IEnumerable.Select是具有以下签名的通用方法

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
)

传入的 function 必须返回一个TResult ,而Select本身返回IEnumerable<TResult> TResult的类型可以由编译器推断(如帖子中所做的那样),也可以显式注释。

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

快乐编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM