Могу ли я перегрузить операторы для класса A класса B в C#? Например:Перегрузка операторов в других классах
class A
{
}
class B
{
public static A operator+(A x, A y)
{
...
}
}
Могу ли я перегрузить операторы для класса A класса B в C#? Например:Перегрузка операторов в других классах
class A
{
}
class B
{
public static A operator+(A x, A y)
{
...
}
}
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! Насти.
Нет, вы не можете. error CS0563: One of the parameters of a binary operator must be the containing type
«В каждом случае один параметр должен быть того же типа, что и класс или структура, объявляющий оператор» из Documentation on overloading operators.
Вообще говоря, нет, но вы можете сделать что-то вроде следующего, если это помогает :)
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 с помощью операторов «+», «==» и «! =». –
Тогда я думаю, что ваш класс, который вы перечислите, должен быть получен из System.Collections.IEnumerable. И затем в вашем классе (который происходит от IEnumerable) вам приходится перегружать нужные вам операторы, и это должно сделать трюк. – dmitril
Мне нужно сравнить и объединить любые IEnumerables на самом деле, являются ли они списками или наборами или любыми другими структурами данных. –
Существуют методы расширения. Я думал, что для операторов есть что-то подобное. –
@Lavir: Мы рассмотрели возможность добавления операторов расширения к C# 4, но для этого не было бюджета. Возможно, в гипотетической будущей версии языка. –