Перегрузка операций преобразования типов

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

Что выведет на консоль следующий код и почему:

class Clock
{
	public int Hours { get; set; }

	public static explicit operator int(Clock clock)
	{
		return clock.Hours * 2;
	}
}
class Program
{
	static void Main(string[] args)
	{
		Clock clock = new Clock { Hours = 15 };

		int x = clock;
		Console.WriteLine(x);   // 30

		Console.ReadKey();
	}
}

Программа не скомпилируется, потому что в классе Clock определен оператор, который предусматривает явное преобразование от типа Clock к типу int. Поэтому на строке int x = clock мы получим ошибку. Для преобразования необходимо применить операцию приведения типов:

int x = (int)clock;
Вопрос 2

При проектировании следующих классов допущены ошибки. Какие?

class Dollar
{
	public decimal Sum { get; set; }
}
class Rouble
{
	public decimal Sum { get; set; }

	public implicit operator Dollar(Rouble roubles)
	{
		return new Dollar { Sum = roubles.Sum / 66 };
	}
	public implicit operator Rouble(Dollar dollars)
	{
		return new Rouble { Sum = dollars.Sum * 66 };
	}
	public implicit operator decimal(Rouble roubles)
	{
		return roubles.Sum;
	}
	public implicit operator decimal(Dollar dollars)
	{
		return dollars.Sum;
	}
}

Варианты ответов (правильных вариантов может быть несколько):

  1. Нельзя определить оператор преобразования в тип decimal

  2. Нельзя определить все операторы преобразования как неявные (с ключевым словом implicit). Необходимо сделать один или несколько операторов явными (определить с ключевым словом explicit)

  3. Слово operator лишнее, так как ключевые слова implicit и explicit уже говорят о том, что определяется оператор преобразования типов

  4. Все операторы преобразования типов должны быть определены как статические (с ключевым словом static)

  5. Необходимо добавить операторы преобразования типов также и в класс Dollar, иначе преобразования раотать не будут

  6. Оператор преобразования типов должен преобразовывать из типа или в тип, в котором этот оператор определен.

Все операторы должны быть определены как статические, то есть с ключевым словом static. Кроме того, оператор преобразования типов должен преобразовывать из типа или в тип, в котором этот оператор определен (то есть нельзя определить оператор преобразования из Dollar в decimal в классе Rouble)

Вопрос 3

Когда необходимо объявлять оператор преобразования как явный (с ключевым словом explicit), и когда как неявный (с ключевым словом implicit)?

Объявлять оператор преобразования как явный или неявный решается произвольным образом. Здесь нет четких критериев.

Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850