Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/jon-skeet-quiz/.
Однажды Джона Скита попросили сформулировать три интересных вопроса на знание C#. Он спросил следующее (оригинал вопросника, перевод статьи):
Q1. Вызов какого конструктора можно использовать, чтобы следующий код вывел True (хотя бы в реализации Microsoft.NET)?
object x = new /* fill in code here */;
object y = new /* fill in code here */;
Console.WriteLine(x == y);
Учтите, что это просто вызов конструктора, вы не можете поменять тип переменных.
Q2. Как сделать так, чтобы следующий код вызывал три различных перегрузки метода?
void Foo()
{
EvilMethod<string>();
EvilMethod<int>();
EvilMethod<int?>();
}
Q3. Как заставить следующий код выбросить исключение во второй строчке с помощью локальной переменной (без хитрого изменения её значения)?
string text = x.ToString(); // No exception
Type type = x.GetType(); // Bang!
Вопросы показались мне интересными, поэтому я решил обсудить их решения.