Что выведет на консоль следующий код и почему:
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;
При проектировании следующих классов допущены ошибки. Какие?
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; } }
Варианты ответов (правильных вариантов может быть несколько):
Нельзя определить оператор преобразования в тип decimal
Нельзя определить все операторы преобразования как неявные (с ключевым словом implicit). Необходимо сделать один или несколько операторов явными (определить с ключевым словом explicit)
Слово operator лишнее, так как ключевые слова implicit и explicit уже говорят о том, что определяется оператор преобразования типов
Все операторы преобразования типов должны быть определены как статические (с ключевым словом static)
Необходимо добавить операторы преобразования типов также и в класс Dollar, иначе преобразования раотать не будут
Оператор преобразования типов должен преобразовывать из типа или в тип, в котором этот оператор определен.
Все операторы должны быть определены как статические, то есть с ключевым словом static. Кроме того, оператор преобразования типов должен преобразовывать из типа или в тип, в котором этот оператор определен (то есть нельзя определить оператор преобразования из Dollar в decimal в классе Rouble)
Когда необходимо объявлять оператор преобразования как явный (с ключевым словом explicit), и когда как неявный (с ключевым словом implicit)?
Объявлять оператор преобразования как явный или неявный решается произвольным образом. Здесь нет четких критериев.