簡體   English   中英

方法和擴展方法參數之間的類型推斷差異

[英]Type inference discrepancy between method and extension method arguments

假設我定義了以下方法:

int ReturnNumber(int number)
{
    return number;
}

現在,我們還定義了以下兩種方法: 常規方法:

void Print(Func<int, int> function)

和擴展方法:

static void Print(this Func<int, int> function)

我可以這樣稱呼前者:

Print(ReturnNumber); // Regular method call, seems to implicitly convert ReturnNumber to Func<int, int>

但我不能使用后者:

ReturnNumber.Print(); // Extension method call, does not seem to do the implicit conversion -- results in compiler error

雖然我可以這樣做:

((Func<int, int>)ReturnNumber).Print(); // I perform the conversion explicitly

我假設當您將一個方法作為參數傳遞給另一個方法時,會發生一些“魔術”,因此編譯器可以猜測它應該嘗試將ReturnNumber轉換為Func<int, int> ,而編譯器不會對擴展方法執行任何此類操作。 它是否正確? 我的問題可以概括為:為什么不能在方法上調用擴展方法,而可以在委托實例上調用擴展方法呢? 它與編譯器不將方法視為對象,而僅將委托視為對象有關嗎?

該方法組可以隱式轉換Func<int, int> ,這意味着如果您在期望使用Func<int, int>的位置使用該方法組(例如,將其傳遞給參數為Func<int, int>則可以將其轉換為這樣的委托。

但是,除非您實際上已將該方法組轉換為Func<int, int> ,否則您將無法在其上調用任何實例方法,因為它沒有任何實例方法。 當您將其顯式轉換為Func<int, int>您正在將該表達式從方法組(本身不是Func<int, int> )更改為Func<int, int>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM