2017-07-28 54 views
5

我最近開始學習一本好書的C#,現在閱讀Conditional屬性和#if編譯器指令。爲什麼有條件的屬性方法不允許返回非空

我知道#if編譯器指令的用法:

#if DEBUG 
public void foo(int value) 
{ ... } 
#endif 

Conditional屬性:

[System.Diagnostics.Conditional("DEBUG")] 
public void foo(int value) 
{ ... } 

我也知道這是由#if包裹代碼... #endif語句不會到達IL,但Conditional屬性代碼會執行並且對該函數的調用將被忽略。

我的問題:
爲什麼有關於Conditional限制屬性的使用,標誌着與屬性函數必須返回voidwritten here in the documentation

如果將此屬性應用於不返回void的方法,您將在Visual Studio中收到編譯錯誤。

我已經搜索了信息,但沒有找到任何解釋。

+3

編號猜測,因爲調用可能不會發生,你不能設置它的值,或者用於決策..因爲它可能不存在.. – BugFinder

+2

如果這是允許的,你期望編譯器在這裏做什麼:'var x = someOtherMethod(foo());' –

+4

當f()沒有被調用時,你會指望'i = f();'分配給'i'嗎? – hvd

回答

3

編譯器不允許這樣做,因爲這樣的代碼,這樣的語義將是不確定的或者最好,而很難理解:

[System.Diagnostics.Conditional("DEBUG")] 
public int foo() 
{ ... } 

var x = someOtherMethod(foo()); 

上調用該方法的方法手段[Conditional("DEBUG")]屬性被省略如果存在「DEBUG」符號,則從編譯後的代碼中讀取。

但是如果foo()的調用從編譯後的代碼中消失了,什麼可以傳入someOtherMethod()?或者如果該呼叫也被移除,那麼要分配給x?如何保證本地x甚至有一個值,這通常會導致編譯錯誤?

.NET團隊決定不這樣做,而是增加了編譯時間約束,[Conditional()]方法必須是void方法。

相關問題