Перегрузка операторов

Последнее обновление: 13.08.2018
Вопрос 1

Оператор + (сложение) при применении к двум объектам типа int возвращает их сумму.

int x = 9;
int y = 10;
int z = x + y;	// 19

Как можно переопределить оператор + для типа int, чтобы этот оператор возвращал не сумму, а произведение двух объектов int?

Никак. Мы не можем переопределить или перегрузить операторы для типов, которые есть в .NET по умолчанию.

Вопрос 2

Есть класс Counter:

class Counter
{
	public int Number { get; set; }
	
	// определение оператора сложения
}

В этом классе определен оператор сложения, который позволяет складывать объект Counter с объектом типа int следующим образом:

Counter counter = new Counter { Number = 45 };
int x = counter + 6;
Console.WriteLine(x);  // 51

Какой именно оператор сложения определен в классе Counter? Варианты ответов (правильных вариантов может быть несколько)

  1. public int operator + (Counter counter, int val)
    {
    	return counter.Number + val;
    }
    
  2. public static int operator + (Counter counter, int val)
    {
    	return counter.Number + val;
    }
    
  3. public static int operator + (int val, Counter counter)
    {
    	return counter.Number + val;
    }
    
  4. public static Counter operator + (Counter counter, int val)
    {
    	return new Counter {Number = counter.Number + val};
    }
    
  5. public static Counter operator + (int val, Counter counter)
    {
    	return new Counter {Number  = counter.Number + val};
    }
    

Правильный ответ:

public static int operator + (Counter counter, int val)
{
	return counter.Number + val;
}
Вопрос 3

Почему не компилируется следующая программа?

class Counter
{
	public int Number { get; set; }

	public static int operator + (int val, Counter counter)
	{
		return counter.Number + val;
	}
}
class Program
{
	static void Main(string[] args)
	{
		Counter counter = new Counter { Number = 45 };
		int x = counter + 6;
		Console.WriteLine(x);  // 51

		Console.ReadKey();
	}
}

Первый параметр оператора сложения в классе Counter представляет тип int, а второй - тип Counter. Поэтому при применении операции сложения левый операнд должен представлять тип int, а правый - объект Counter:

int x = 6 + counter;
// вместо
// int x = counter + 6;
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850