2013-10-03 38 views
2

有沒有人對C#中非靜態隱式運算符的支持缺乏雄辯的解決方案?下面的代碼顯示了我當前的問題:非靜態隱式運算符

class Foo 
    { 
     public int x { get; set; } 
     public int y { get; set; } 

     public Foo() 
     {      
     } 

     public static implicit operator Foo(Bar b) 
     { 
      Foo newFoo = new Foo(); 
      newFoo.y = b.y; 
      return newFoo; 
     } 
    } 

    class Bar 
    { 
     public int y { get; set; } 

     public Bar() 
     { 
     } 
    } 

    Foo foo = new Foo(); 
    foo.x = 42; 
    Bar bar = new Bar(); 
    bar.y = 52; 
    foo = bar; 

    Console.WriteLine(foo.x); // THIS PRINTS 0 

這裏是我要找的功能:

 public implicit operator Foo(Bar b) 
    { 
     this.y = b.y; 
    } 

回答

9

幸運的是,你不能做到這一點。我說「幸運」,因爲它是非常混淆爲讀者。我建議你只是寫一個方法,例如MergeFrom,使你的代碼然後讀取:

// Object initializers used for readability. 
Foo foo = new Foo { x = 42 }; 
Bar bar = new Bar { y = 52 }; 
foo.MergeFrom(bar); 

這是在意圖方面更加清晰,IMO。

賦值運算符總是設置變量的值在左手邊右手邊的價值 - 可能通過轉換,但從未基於變量的左手現有值側。這就是語言的工作原理 - 而你正試圖改變它。

不要與語言作鬥爭:任何閱讀代碼的人都不會感謝你。相反,工作語言的成語。

如果你真的使用某種類型的運營商,你總是可以重載+操作:

public implicit operator +(Foo lhs, Bar rhs) 
{ 
    return new Foo { x = lhs.x, y = rhs.y }; 
} 

然後你可以使用:

foo += bar; 

...這又是更清楚foo的最終值取決於現有值。

+0

'+ ='選項很有趣,但在這種情況下它仍然相當混亂,因爲你可能直覺地期望它將兩個y值相加。 –

+0

@丹Bryant:是的,這也不是我的第一選擇,說實話。我喜歡'MergeFrom'的顯式性質。 –