2017-05-29 26 views
0

從C#果殼一個void表達式沒有價值嗎?

表達式和運算符

的表達基本上表示一個值。

...

空隙表達式

void表達式是不具有值的表達式。例如:

Console.WriteLine (1) 

void表達式,因爲它沒有值,不能被用作操作數 構建更復雜的表達式:

1 + Console.WriteLine (1)  // Compile-time error 
  1. 由於空隙表達式是一個表達,它必須表示一個值。 但它如何「沒有價值」?
  2. 由於void表達式沒有值,是一個void表達式 聲明?

謝謝。


閱讀從埃裏克利珀答案Can a C# lambda expression ever return void?,如在評論中指出魯弗斯信用證後,我有以下問題:

  • 是一個方法的調用總是一個表情,其值是否是該方法返回的值?

  • 是一個void表達式總是調用返回void的方法嗎?

+0

語句和表達式可以被認爲是語法結構,並且在類型級別上是void。所以這裏的缺點是「因爲X是一個表達式,它必須表示一個值」 - 只有當表達式不產生無效時纔是真實的。(2)只有在所有表達式都是陳述的情況下才是真實的。 – Ryan

+0

從@Eric Lippert查看以下問題的答案:https://stackoverflow.com/questions/2029433/can-a-c-sharp-lambda-expression-ever-return-void –

+0

@RufusL謝謝。 (1)帶'return'語句的方法總是一個表達式,其值是方法中'return'語句返回的值? (2)是一個void表達式,總是調用一個'return' void的方法嗎? – Tim

回答

3

由於空隙表達式是一個表達式,它必須表示一個值。但它怎麼能「沒有價值」呢?

該聲明是錯誤的。表達式不需要「表示值」。

大多數表達式都可以。有些不。特別是:歸類爲「無」

  • 表情,因爲他們都是無效的返回方法

  • 的調用,說System.Console.WriteLine("")我們有代表的命名空間,而不是一個值的表達式System,和表達式System.Console其表示類型,而不是值。

  • x[1] = 123;x[1]表示可變set訪問,而不是一個

  • 在C#7中,您現在可以在需要表達式的上下文中使用throw,但它沒有值。

依此類推。有很多表達不表示數值;你能想到更多嗎?

Albahari只是簡化教學目的。有關如何評估表達式的確切定義,請閱讀規範。

由於void表達式沒有值,是一個void表達式的聲明嗎?

是始終方法的調用的表達,其值由該方法返回的值?

是的,假設該方法返回一個值。

練習:列出一個方法調用可以使用的所有方法而不是返回一個值。

是一個void表達式總是調用返回void的方法嗎?

是的。

「不返回值的方法」和「返回無效的方法」之間的區別是什麼?

返回void的方法不返回值。但是有一些不返回值的非void方法。你能寫一個嗎?

「到方法的調用不返回值不是一個表達式」

這種說法是錯誤的。所有方法調用都是表達式,而不管它們是否返回值。

到返回void的方法的呼叫是一個空隙表達

這是正確的。

你真的應該閱讀規範。這是精確的。

+0

謝謝。 (1)「不返回值的方法」和「返回無效的方法」有什麼區別? (2)在你的回覆中,似乎「對不返回值的方法的調用不是表達式」,而「對返回無效的方法的調用是無效表達式」。 – Tim