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)說:「不是所有的代碼路徑都返回一個值」。爲什麼?在什麼情況下這個函數不會返回一個值?爲什麼編譯器報告錯誤?
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)說:「不是所有的代碼路徑都返回一個值」。爲什麼?在什麼情況下這個函數不會返回一個值?爲什麼編譯器報告錯誤?
編譯器沒有看你的條件。即使你是正確的,你如果塊中的至少一個會跑,你仍然需要重構,以這樣的:
if (n < 0)
return 1;
else if (n == 0)
return 2;
else
return 3;
編譯器不會試圖確定這覆蓋了所有可能的值n
。所有它看到的是,你有三個if
陳述,並且它假定它們可能是所有都是錯誤的......在這種情況下,你會在沒有返回值的情況下到達方法的末尾。
請參閱this blog post from Eric Lippert瞭解有關編譯器在可達性方面的限制的更多詳細信息。
只是使最終的回報無條件。
+1 - 我想我只是推遲到你:) –
+1連接到Lippert。 –
+1很好的答案。 – 2011-06-29 21:20:12
編譯器是不夠聰明,知道所有這些分支的相互所以它擔心全部三條if語句失敗的情況。
您可以將所有if
語句與else
鏈接在一起,並且只對最後一個條件使用else
,或者可以在最後返回默認值。這將解決這個問題。
它甚至已被證明它永遠不夠聰明。這就是所謂的停機問題。 http://en.wikipedia.org/wiki/Halting_problem –
@JonasElfström:非常真實。 :-) –
編譯器不知道你已經涵蓋了所有的基礎。你可以把它改寫這樣的...
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
}
你的意思是,如果(N == 0)? –
嗨,我編輯你的帖子來顯示所有的代碼。在StackOverflow中,您只需要1.使用四個空格縮進任何代碼,或2.完成後突出顯示您的代碼並單擊「{}」按鈕。 (我認爲你的代碼被'<' and '>'字符覆蓋了。) –
爲什麼n和0之間的運算符缺失? –