簡體   English   中英

C#編譯器在每次編譯時不會立即報告所有錯誤嗎?

[英]Is C# compiler not reporting all errors at once at each compile?

當我編譯這個項目時,它在錯誤列表窗口中顯示400多個錯誤,然后我轉到錯誤站點,修復一些,然后數字說120+錯誤,然后在修復一些之后,下一個編譯報告再次像400+。 我可以看到錯誤列表窗口中出現了不同的文件,所以我認為編譯器在發生一定數量的錯誤后會中止?

如果是這樣,原因是什么? 它是否應該收集項目中存在的所有錯誤,即使它們超過10K +?

我一直想寫一篇關於此的博客文章。

對於報告的錯誤數量,您可能只是遇到了一些硬編碼限制。 你也可能遇到一個更微妙和有趣的場景。

命令行編譯器和IDE編譯器中有許多試圖管理錯誤報告的啟發式方法。 兩者都是為了讓用戶可以管理,並使編譯器更加健壯。

簡而言之,編譯器的工作方式是嘗試通過一系列階段獲取程序,您可以在這里閱讀:

http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx

我們的想法是,如果早期階段出現錯誤,我們可能無法在沒有(1)進入無限循環,(2)崩潰或(3)報告瘋狂的“級聯”錯誤的情況下成功完成后續階段。 所以會發生什么,你得到一個錯誤,你修復它,然后突然下一個編譯階段可以運行,它會發現更多的錯誤。

基本上,如果程序如此混亂以至於我們甚至無法驗證有關其類和方法的基本事實,那么我們就無法可靠地為方法體提供錯誤。 如果我們無法分析lambda體,那么我們就無法可靠地為其轉換為表達式樹提供錯誤。 等等; 在很多情況下,后期階段需要知道前面的階段完成沒有錯誤。

這種設計的好處在於:(1)你首先得到最“基本”的錯誤,沒有很多嘈雜,瘋狂的級聯錯誤,以及(2)編譯器更強大,因為它不需要嘗試對語言的基本不變量被破壞的程序進行分析。 缺點當然是你的情況:你有50個錯誤,你修復它們,突然又出現了50個。

當然它會在某個時候停止。

即使在1次錯誤之后,其余的都是可疑的。 編譯器將嘗試恢復,但不能保證成功。

因此,在任何非平凡的項目中,在停止第一個錯誤(理論上最好的事情)和在不可靠的狀態下耕作之間是一個實際的決定。

最正確的操作是在1次錯誤后停止,但這會導致繁瑣的“一次修復1”情況。 因此編譯器會嘗試重新同步到已知狀態並報告下一個狀態。 但是錯誤可能會導致跟隨它的正確代碼出現錯誤錯誤,所以在某些時候它會停止合理。

請參考您自己的案例:經過一些修復后,400+會變為120。

它可以根據MSDN進行配置

默認情況下,最大數量為200個錯誤和警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM