我可以用C#中的類B中的類A重載運算符嗎?例如:在其他類中重載的運算符
class A
{
}
class B
{
public static A operator+(A x, A y)
{
...
}
}
我可以用C#中的類B中的類A重載運算符嗎?例如:在其他類中重載的運算符
class A
{
}
class B
{
public static A operator+(A x, A y)
{
...
}
}
不;其中一個參數必須是包含類型。
從語言規範的第§10.10.2(4.0版):
下列規則適用於二進制運算符聲明,其中
T
表示類或結構的實例類型包含運算聲明:•二進制非移位運算符必須帶兩個參數,其中至少一個參數必須具有類型
T
或T?
,並且可以返回任何類型。
你應該思考爲什麼。這是一個原因。
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的加法!討厭。
不,你不能。 「error CS0563: One of the parameters of a binary operator must be the containing type
」在每種情況下,一個參數必須與聲明運算符的類或結構體的類型相同「來自 Documentation on overloading operators的引用。
通常說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
要了解你的問題,我可以問你爲什麼要這麼做? :)
我想用「+」,「==」和「!=」運算符擴展IEnumerable。 – 2010-10-21 05:20:42
然後,我認爲你將要enumirate的類應該從System.Collections.IEnumerable派生。然後在你的類(從IEnumerable派生出來的)中,你必須重載你需要的操作符,並且應該做到這一點。 – dmitril 2010-10-21 06:34:08
實際上,我需要比較和連接任何IEnumerables,無論它們是列表或集合還是任何其他數據結構。 – 2010-10-22 14:47:19
有擴展方法。我認爲運營商有類似的東西。 – 2010-10-20 20:36:50
@Lavir:我們考慮將擴展操作符添加到C#4中,但沒有這樣做的預算。也許在這個語言的假設未來版本中。 – 2010-10-20 21:37:46