簡體   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