2013-07-03 39 views
1

我真正想實現的目標:爲object引入一個全局別名。cs0553不允許用戶自定義基類轉換

由於有在C#中沒有全局別名我想解決辦法,通過提供另一個類myclass到所有的對象都隱式可轉換,例如:

myclass foo() { return new object(); } // should be ok 
myclass bar() { return "bla"; } // should be ok 

如何?

(轉換操作符:

public static implicit operator myclass(object o) 
    { 
     return new given(); 
    } 

只輸出編譯器錯誤cs0553)

回答

2

嗯,你不能這樣做。從C#4規範的第10.10.3:

類或結構允許聲明從源類型S轉換到目標類型T僅當以下所有條件都爲真:

  • ...
  • Exclusing用戶定義的轉換,轉換不存在從ST或從TS

你的情況並非如此,因此錯誤。

你還沒有說爲什麼你想這樣做(你提到「沒有全球別名」,但它不清楚你想達到什麼),但你不能這樣做。你可以創建一個構造函數或一個靜態方法來創建你的類的一個實例,但是你不能用一個操作符來完成它。

+0

我越使用C#,越是經常發現弱點(在這種情況下沒有全局類型別名...)。對於我的問題還有其他解決方法嗎? –

+0

@ D.R .:不,因爲我們真的不知道你的意思是「沒有全局類型別名」在這裏。你真的想達到什麼目的?這會給你帶來什麼好處?它看起來不像我曾經想做的任何事情 - 看起來語言設計師也不希望你也想這樣做。一般來說,打這樣的語言是一個壞主意。 –

+0

我們是規範框架(比如MSpec)的API設計者,並且希望通過其返回類型來區分給定/何時方法。不幸的是,你無法給出void的別名,並且在運行時通過Reflection找到「given」和「when」。所以我們介紹了自己的類。但是,何時是枚舉,給定方法應該返回被測試的主題 - 我們並不知道某種類型的對象。 –

相關問題