2014-12-03 75 views
2

我將api中的一串字符串轉換爲類。我廣泛使用編譯器來幫助我,因爲我可以替換核心API中的某些類型,並遵循類型錯誤。禁止字符串與對象連接

然而,有缺陷的這種方法令人沮喪的源:

// linqpad snippet 
void Main() 
{ 
    var t = "yay : " + (new Foo()); 
    t.Dump(); // "yay: namespace.Foo" instead of compilation error 
} 

class Foo { 
} 

C#將愉快地加在一起的字符串和任何用戶定義的對象。有沒有辦法將它變成警告或編譯錯誤?

我想要一個編譯錯誤,因爲這個數據最終會顯示給用戶。如果我錯過了一個連接,用戶會在應用程序中看到類名,這實際上並不是我想要的行爲。

+0

寫愚蠢的代碼沒有任何警告! :) – DavidG 2014-12-03 09:25:43

+0

爲什麼這必須是警告或錯誤? – Dennis 2014-12-03 09:28:09

+0

@DavidG我處於重構狀態。我有50多個班級一起交流。我想用由一個類表示的一些其他數據替換由字符串表示的一些數據。在使用字符串連接的類中,我想使用其他形式的組合。如果編譯器不能幫助我,那意味着我可能會錯過一些東西,並且用戶會在應用程序中看到不相關的類名。 – Simon 2014-12-03 09:30:23

回答

3

C#將愉快地將字符串和任何用戶定義的對象相加。有沒有辦法將它變成警告或編譯錯誤?

是 - 如果你正在使用Visual Studio 2015年或更高:)

您可以使用Roslyn來創建自己的代碼的診斷/代碼修復,而且我相信您可以從升級的問題僅僅是一個錯誤的警告。然後,您可以在持續集成構建中包含此診斷。

要小心你走多遠 - 雖然我通常會嘗試在代碼審查中處理這個問題,而不是使其成爲完全錯誤。創建您自己的C#方言可能是一個不切實際的傾斜...

請注意,在某些情況下,您提供的代碼可能完全合適 - 例如,Foo覆蓋ToString()。你真的肯定你想禁止嗎?

+0

謝謝你的回答。我相信我想禁止所有繼承一些抽象類或實現給定接口的類。我希望更簡單一些。由於我們使用visual 2013,我會嘗試編寫一個fxcop規則。我希望有一個更簡單的解決方案可以存在:-(擁有這樣的默認行爲,而不是'IRepresentable'界面似乎很瘋狂 – Simon 2014-12-03 09:36:29

+0

我們正在進行評論,但是「風險表面」在這一塊上真的很大 – Simon 2014-12-03 09:37:56

1

一個可能的解決方案(這可能不合適)將覆蓋類中的ToString方法,並使它們引發錯誤。這會不會給你編譯時錯誤,但會給出一個運行時異常:

public class Test 
{ 
    public override string ToString() 
    { 
     throw new NotImplementedException(); 
    } 
} 

當然,這一切都沒有好,如果你已經覆蓋ToString。作爲一個額外的級別,你可以裝飾你的重寫,以表明該方法不使用:

[Obsolete("Don't use this!")] 
public override string ToString() 
{ 
    throw new NotImplementedException(); 
} 

雖然這會對你發佈的代碼沒有任何影響,你應該得到警告,任何地方,你明確要求ToString,爲例如,這會給編譯器一個警告:

var s = (new Test()).ToString(); 
+0

很遺憾這個方法不會在var s =「」+(new Test())上產生警告;' – Simon 2014-12-03 10:55:57

+0

是的,我在我的回答中提到過,但它會產生運行時異常。 – DavidG 2014-12-03 10:56:38