2011-06-29 29 views
5
public static int Test(int n) 
{ 
    if (n < 0) return 1; 
    if (n == 0) return 2; 
    if (n > 0) return 3; 
} 

編譯器(Visual Studio 2010,C#4.0)說:「不是所有的代碼路徑都返回一個值」。爲什麼?在什麼情況下這個函數不會返回一個值?爲什麼編譯器報告錯誤?

+0

你的意思是,如果(N == 0)? –

+1

嗨,我編輯你的帖子來顯示所有的代碼。在StackOverflow中,您只需要1.使用四個空格縮進任何代碼,或2.完成後突出顯示您的代碼並單擊「{}」按鈕。 (我認爲你的代碼被'<' and '>'字符覆蓋了。) –

+0

爲什麼n和0之間的運算符缺失? –

回答

8

編譯器沒有看你的條件。即使你是正確的,你如果塊中的至少一個會跑,你仍然需要重構,以這樣的:

if (n < 0) 
    return 1; 
else if (n == 0) 
    return 2; 
else 
    return 3; 
10

編譯器不會試圖確定這覆蓋了所有可能的值n。所有它看到的是,你有三個if陳述,並且它假定它們可能是所有都是錯誤的......在這種情況下,你會在沒有返回值的情況下到達方法的末尾。

請參閱this blog post from Eric Lippert瞭解有關編譯器在可達性方面的限制的更多詳細信息。

只是使最終的回報無條件。

+1

+1 - 我想我只是推遲到你:) –

+0

+1連接到Lippert。 –

+0

+1很好的答案。 – 2011-06-29 21:20:12

2

編譯器是不夠聰明,知道所有這些分支的相互所以它擔心全部三條if語句失敗的情況。

您可以將所有if語句與else鏈接在一起,並且只對最後一個條件使用else,或者可以在最後返回默認值。這將解決這個問題。

+3

它甚至已被證明它永遠不夠聰明。這就是所謂的停機問題。 http://en.wikipedia.org/wiki/Halting_problem –

+0

@JonasElfström:非常真實。 :-) –

1

編譯器不知道你已經涵蓋了所有的基礎。你可以把它改寫這樣的...

public static int Test(int n) 
{ 
    if (n < 0) return 1; 
    else if (n == 0) return 2; 
    else (n > 0) return 3; 
} 

或本...

public static int Test(int n) 
{ 
    if (n < 0) return 1; 
    if (n == 0) return 2; 
    if (n > 0) return 3; 
    return 4; //will never occur 
} 
相關問題