示例代碼:爲什麼編譯器認爲Environment.Exit可以返回?
switch(something)
{
case 0:
System.Environment.Exit(0);
case 1:
// blah ...
break;
}
它不能編譯,因爲編譯器認爲該執行可以從出口返回()。編譯器顯然是錯誤的。
沒有竅門。 System.Environment.Exit()
是真正的。
不僅對於System.Environment.Exit()
返回是完全不合邏輯的,我追溯了代碼,最終調用了ExitProcess(exitCode);
,它不能返回。
由於編譯器無法查看方法的IL以知道在運行時將執行什麼(因爲編譯器絕對沒有辦法知道在運行時將裝載什麼精確的程序集),您將如何*建議編譯器知道給定的方法不會返回? –
@AlexeiLevenkov:鑑於目前的情況,[System.Runtime.InteropServices.NoReturn] void Exit(int ExitCode);如果我重新寫這個,會有一個類似於System.Void的類型,意味着無法訪問。 – Joshua
屬性不是方法簽名的一部分 - 所以它不起作用,因爲編譯器不能保證在運行時加載庫來實現該方法甚至會擁有該屬性(忽略編譯器和JIT必須強制執行的事實莫名其妙)。事實上,返回特殊類型是方法簽名的一部分,但它是否值得構建整個額外基礎結構,以驗證該方法無法返回此方法終止進程的特殊情況? –