2010-10-20 32 views

回答

3

不;其中一個參數必須是包含類型。

從語言規範的第§10.10.2(4.0版):

下列規則適用於二進制運算符聲明,其中T表示類或結構的實例類型包含運算聲明:

•二進制非移位運算符必須帶兩個參數,其中至少一個參數必須具有類型TT?,並且可以返回任何類型。

你應該思考爲什麼。這是一個原因。

class A { } 
class B { public static A operator+(A first, A second) { // ... } } 
class C { public static A operator+(A first, A second) { // ... } } 

A first; 
A second; 
A result = first + second; // which + ??? 

下面是另一個:

class A { public static int operator+(int first, int second) { // ... } } 

假設這允許了一會兒。

int first = 17; 
int second = 42; 
int result = first + second; 

按照規範符重載解析(§7.3.2),A.+將優先於Int32.+。我們剛剛重新定義了int s的加法!討厭。

+0

有擴展方法。我認爲運營商有類似的東西。 – 2010-10-20 20:36:50

+1

@Lavir:我們考慮將擴展操作符添加到C#4中,但沒有這樣做的預算。也許在這個語言的假設未來版本中。 – 2010-10-20 21:37:46

1

不,你不能。 「error CS0563: One of the parameters of a binary operator must be the containing type

」在每種情況下,一個參數必須與聲明運算符的類或結構體的類型相同「來自 Documentation on overloading operators的引用。

0

通常說NO,但你可以做這樣的事情之後,如果它可以幫助:)

class A 
{ 
    public static A operator +(A x, A y) 
    { 
     A a = new A(); 
     Console.WriteLine("A+"); // say A 
     return a; 
    } 
} 

class B 
{ 
    public static A operator +(A x, B y) 
    { 
     A a = new A(); 
     Console.WriteLine("return in:A,B in out:A in class B+"); // say B 
     return a; 
    } 

    public static A operator +(B x, B y) 
    { 
     A a = new A(); 
     Console.WriteLine("return in:B,B in out:A in class B +"); 
     return a; 
    } 
    // and so on.... 

} 


B b = new B(); 
A a = new A(); 
A a1 = new A(); 
B b1 = new B(); 

a = b + b1; // here you call operator of B, but return A 
a = a + a1; // here you call operator of A and return A 

要了解你的問題,我可以問你爲什麼要這麼做? :)

+0

我想用「+」,「==」和「!=」運算符擴展IEnumerable。 – 2010-10-21 05:20:42

+0

然後,我認爲你將要enumirate的類應該從System.Collections.IEnumerable派生。然後在你的類(從IEnumerable派生出來的)中,你必須重載你需要的操作符,並且應該做到這一點。 – dmitril 2010-10-21 06:34:08

+0

實際上,我需要比較和連接任何IEnumerables,無論它們是列表或集合還是任何其他數據結構。 – 2010-10-22 14:47:19