8

我一個計算模塊上工作用C#和我撞到這個:如何警告由於類型轉換引起的潛在算術錯誤?

double v = 4/100; 

我知道這是一個錯誤的初始化,返回的v = 0.0代替v = 0.04

C#的規則,說我必須保證成員中至少有一個是雙,像這樣:

double v = (double) 4/100; 
double v = 4.0/100; 

不過,我有這樣的很多很多初始化即涉及到整型變量操作,我感到懶惰的逐行瀏覽我的代碼來檢測這樣的錯誤。

相反,是否有可能被編譯器警告?

+0

這取決於你使用的編譯器。錯誤消息和警告不是該語言的內置功能,而是編譯器添加的內容。如果你使用的編譯器不支持它,那麼不,這是不可能的。 – Hoeloe

+1

有[uservoice ticket](http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2813345-add-a-warning-when-promoting-the-result-of-integer)詢問爲此功能。 –

+0

我使用.NET 4.0和Visual Studio 2010提供的C#編譯器。 – Larry

回答

4

好吧,一些玩耍並沒有什麼後,我有一個解決方案。我使用this article來解決這個問題。我使用StyleCop,所以你需要獲取並安裝它。然後,你可以下載我的C#項目MathematicsAnalyzer

首先,我沒有考慮所有類型轉換不匹配。事實上,我只容納一部分。

基本上,我檢查行是否包含「double」後跟一個空格。我知道這可能會導致錯誤的警告,因爲課程的結束可能是雙重或其他任何事情,但我會讓你知道如何正確隔離類型。

如果發現匹配,我檢查,看看它這個正則表達式匹配:

double[ ][A-Za-z0-9]*[ ]?=(([ ]?[0-9]*d[ ]?/[ ]?[0-9]*;)|[ ]?[0-9]*[ ]?/[ ]?[0-9]*d;) 

如果是-not-匹配這個表達式,然後我添加違規。這個正則表達式匹配的是以下任何一種:

  • double i = 4d/100;
  • double i = 4d/100;
  • double i = 4/100d;
  • double i = 4/100d;
  • double i = 4/100d;
  • double i = 4/100d;
  • double i = 4d/100;
  • double i = 4/100d;
  • double i = 4/100d;

以上任何一項都不會造成違規。正如目前所寫的,如果不使用'd',它會拋出違規。您需要添加額外的邏輯來說明顯式強制操作數的其他可能方式。在寫這篇文章時,我剛剛意識到,在兩個操作數上都有'd'很可能會拋出異常。哎呦。

最後,我無法讓StyleCop正確顯示我的違規行爲。它一直給我一個關於不存在的規則的錯誤,即使有了它的第二雙眼睛,我們也找不到解決方案,所以我就黑了。該錯誤顯示您試圖找到的規則的名稱,所以我只是將該規則的名稱作爲描述性內容並在其中包含行號。

要安裝自定義規則,請構建MathematicalAnalyzer項目。關閉Visual Studio並將DLL複製到StyleCop安裝目錄中。當您打開Visual Studio時,您應該在StyleCop設置中看到該規則。我用過的文章的第5步和第6步顯示了在哪裏做到這一點。

在整個解決方案中,這隻會一次得到一個違規,因此您必須修復它顯示的違規行爲,然後再次運行StyleCop以查找下一個違規。可能有一種解決辦法,但我用盡果汁,停在這裏。

享受!

+0

非常感謝。這並不完美,但它有很大的幫助。 – Larry

3

本文解釋如何設置自定義代碼分析規則,當您運行代碼分析時,可以顯示警告和不顯示警告。

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and-vs2008-too/

+0

非常感謝您提供此信息。不幸的是,實現自定義規則解析我的代碼以避免類型轉換不匹配並不容易。 – Larry

+0

我完全理解。我想到了這一點,但這是我在研究中找到的唯一途徑。 – seekerOfKnowledge

相關問題