2010-10-20 6 views

ответ

3

No; один из параметров должен быть содержащим типом.

Из раздела §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! Насти.

+0

Существуют методы расширения. Я думал, что для операторов есть что-то подобное. –

+1

@Lavir: Мы рассмотрели возможность добавления операторов расширения к C# 4, но для этого не было бюджета. Возможно, в гипотетической будущей версии языка. –

1

Нет, вы не можете. error CS0563: One of the parameters of a binary operator must be the containing type

«В каждом случае один параметр должен быть того же типа, что и класс или структура, объявляющий оператор» из Documentation on overloading operators.

0

Вообще говоря, нет, но вы можете сделать что-то вроде следующего, если это помогает :)

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 с помощью операторов «+», «==» и «! =». –

+0

Тогда я думаю, что ваш класс, который вы перечислите, должен быть получен из System.Collections.IEnumerable. И затем в вашем классе (который происходит от IEnumerable) вам приходится перегружать нужные вам операторы, и это должно сделать трюк. – dmitril

+0

Мне нужно сравнить и объединить любые IEnumerables на самом деле, являются ли они списками или наборами или любыми другими структурами данных. –