2012-02-05 63 views
0

我有一個字符串類的自定義實現。我在字符串和類之間添加了自定義轉換運算符,並且投射正常工作。但是,如果我第一次將自定義對象轉換爲System.Object,然後將其轉換爲字符串:「無法將類型'MyString'轉換爲鍵入'System.String'」。這是爲什麼?我怎樣才能使它...C#與轉換運算符鑄造

class MyString 
{ 
    public string S {get; set;} 

    public MyString(string s) 
    { 
     this.S = s; 
    } 

    public static implicit operator string(MyString s) 
    { 
     return s.S; 
    } 
    public static implicit operator MyString(string s) 
    { 
     return new MyString(s); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyString ms = new MyString("a"); 
     string s = ms; 
     object o = ms; 
     string s1 = (string)o; // <-- this throws the exception! 
    } 
} 
+0

這是一個明確的演員。如果定義了隱式轉換,則沒有明確的運算符 – 2012-02-05 17:28:00

+0

顯式轉換工作。 – nogola 2012-02-05 17:31:07

回答

6

轉換這樣必須在編譯時來確定 - 而在你的最後一行,的o編譯時類型只是object,所以編譯器沒有按't'知道'你的轉換作爲一種選擇。

除了僅僅說「不這樣做」之外,很難知道最佳解決方案 - 如果您使用dynamic而不是object(當然,您使用的是C#4),那麼它將工作 - 但我個人只會嘗試而不是依賴於像這樣的用戶定義的轉換。他們讓代碼庫很難理解,IMO。

任何閱讀表達(string) o其中o只是object期望這是一個簡單的演員,即一個,如果o沒有實際上是指一個字符串(或者是一個空引用),這將失敗。試圖找到混淆期望的方法是一個糟糕的主意,國際海事組織。

3

我會在班上覆蓋ToString。然後用o.ToString()代替(string)o