2009-09-29 46 views
3

在下面的代表示例中,編譯器如何推斷變量alpha是什麼類型?編譯器如何推斷代表示例中的類型?

delegate double Doubler(double x); 

public class Test 
{ 
    Doubler dbl = (alpha) => //How does it determine what type is alpha? 
    { 
     return alpha * 2 
    }; 

    Console.WriteLine(dbl(10)); //Is it when the method is called? int here; 

    Console.WriteLine(dbl(5.5)); //double here??? 
} 

我在一個網站上發現了這個聲明,我猜根據這個迴應,這是不正確的嗎?

「在我們的例子中,我們指定了參數的類型,如果你願意,你可以讓編譯器找出參數的類型,在這種情況下,只傳遞參數的名稱而不是類型。是一個例子:「

回答

6

你在你的委託中聲明它。

delegate double Doubler(double x); 

x是你的alpha。

你可以很容易地替換您的代碼:

Doubler dbl = delegate (double x) 
{ 
    return x*2; 
}; 

而且你可以簡化您的lambda表達式:

Doubler dbl = alpha => alpha*2; 
+0

嗯,沒想到這一點,所以這是真的,編譯器實際上並不能推斷類型? – Xaisoft 2009-09-29 22:01:38

+0

不,不是在這種情況下。但是,如果您使用通用約束,它可以推斷出該類型。 – atsjoo 2009-09-29 22:04:41

+0

你能提供一個通用約束的例子嗎? – Xaisoft 2009-09-29 22:06:59

1

您指定的輸入類型是雙當你定義的倍增委託。對於這兩個示例,輸入類型都是雙倍的。

5

這種語言功能看起來很簡單,但實際上確實非常複雜。這裏需要太多的空間來描述這個特徵的所有後果究竟是什麼。如果您對真的感興趣,那麼編譯器應該如何處理lambda形式參數的類型,您應該閱讀我的五部分文章系列文章,討論我們如何實現這一點以及編譯器設計會產生什麼後果。

這裏是我的我的所有文章,我討論了lambda表達式的含義檔案:

http://blogs.msdn.com/ericlippert/archive/tags/Lambda+Expressions/default.aspx

你應該閱讀題爲「Lambda表達式與匿名方法」系列。

如果你感興趣的編譯器如何執行其他類型推論,這是我上的文章歸檔:

http://blogs.msdn.com/ericlippert/archive/tags/Type+Inference/default.aspx

如果你是何許人誰喜歡看視頻,閱讀文本,這是我在2006年做了一個視頻解釋了一些類型推斷的場景:

http://blogs.msdn.com/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx

+0

太棒了!感謝您的資源。即使我不明白它,我也會一直讀你的博客:) – Xaisoft 2009-09-30 05:04:38

相關問題