2012-06-09 10 views
2

在編寫一個C#Metro DLL的輸出爲WinMD格式的時,我有一個公共類Id。雖然它覆蓋Equals,但不允許超載==在C#Windows運行時組件中,如何警告開發人員不要在公共類中使用==?

但是,這個相同的類在DLL內部使用,並且不可避免地使用LINQ,我發現自己編寫了.Where(x => x.Id == Ids.House),這顯然不起作用。

一個可能的解決方案是定義一個IdInternal,它是內部的,可以覆蓋==,然後將其包裝在Id中。

如果沒有解決方案(我懷疑它會發生幾個類),有什麼辦法通過編譯/運行時錯誤警告開發人員,他們不應該使用==這個類?

+0

重載(這不是重載)'=='適用於Win8 CP下的VS11 Beta。是什麼讓你覺得你不能這樣做? – svick

+0

糟糕!感謝您指出了這一點。當您將輸出類型切換到WinMD時,您將獲得框架的受限子集。請參閱http://msdn.microsoft.com/en-us/library/windows/apps/hh977010(v=vs.110).aspx#OperatorOverloading「運行過載不允許」 – Jedidja

回答

2

winmd文件不支持運算符重載。編譯器可能會有一個錯誤,阻止他們阻止在winmd文件中使用操作符重載,但不能依賴這種行爲。

我認爲InternalId和Id可能是最好的選擇。

+0

公平足夠 - 我希望有可能是目前文檔中沒有提到的各種解決方法:)感謝您的確認。 – Jedidja

0

我有個主意。說你的Id是Int。

創建一個新的自定義類型,向Int運算符添加顯式轉換,並將[Obsolete]屬性標記爲結果警告。

+0

我不明白,怎麼會這種幫助?也許代碼示例會很有用。 – svick

+0

我試圖實現它,但新的自定義類型也不能暴露在Windows運行時的操作符重載,所以你最終包裝公共類中的內部類型,我認爲這是我希望避免在問題:) – Jedidja

相關問題