[英]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.