Задачки на C#

В прошлый четверг на конференции SECR я сделал небольшой доклад по некоторым не совсем очевидным моментам в C#, которые могут поставить в тупик программиста. В этом сообщении я публикую список задач, о котором рассказал на конференции.

Я предлагаю сыграть в следующую игру - посмотрите на задачи, запишите решения пришедшие вам в голову (условие: не запускать и не компилировать программы!), а потом напишите в комментариях к сообщению количество правильных ответов (можно проверить запустив компилятор, а можно дождаться публикации решений - я сделаю это через несколько дней). Если не стесняетесь, то сразу напишите ваши предположения и объяснения по полученному результату.

Задачи я собирал давно, ниже приведены лишь самые простые, которые очень удобно показывать на слайдах презентации. Саму презентацию меня сподвигла сделать книга Java Puzzlers: Traps, Pitfalls, and Corner Cases, поскольку часть задачек оказалась похожими как две капли воды. Кстати, не может не радовать, что многие проблемные моменты Java, на которых строятся задачи из книги, в C# просто отсутствуют :)

Если у вас есть интересные задачи на C# - присылайте, я с радостью добавлю их в коллекцию!

Задачи

1. Каков результат компиляции и выполнения приведенного ниже кода?

static void Main(string[] args)
{
    Console.WriteLine(GetSomeResult(10000));
}

static long GetSomeResult(long someValue)
{
    long value1 = 10 * 1000 * 10000 * someValue;
    long value2 = 10 * 1000 * 10000 * 100000;
    return value2 / value1;
}

2. Какое значение присвоено x, если приведенный ниже код выводит False?

float x;
Console.Write(x == x)

3. А почему следующий код выводит False?

public static void Main()
{
    Test t = new Test();
    Console.WriteLine(t.Equals(t));
}

4. Что будет выведено на экран при выполнении приведенного ниже кода?

static void Main(string[] args)
{
    char a = 'a';
    int b = 0;
    Console.WriteLine(true ? a : b);
}

5. А в этом случае, что будет на экране?

NameValueCollection col = new NameValueCollection();
Console.WriteLine("Элемент test " + col["test"] != null ? "Существует!" : "Не существует!");

6. Что следует ожидать на экране?

Console.WriteLine("A" + "B" + "C");
Console.WriteLine('A' + 'B' + 'C');

7. Циклическая инициализация полей? Интересненько, а в результате что будет на консоли выведено?

public class A { public static int x = B.y + 1; }
public class B { public static int y = A.x + 1; }

static void Main(string[] args)
{
    Console.WriteLine("A.x = " + A.x);
    Console.WriteLine("B.y = " + B.y);
}

8. Инкремент, инкремент, а что же будет?

int j = 0;

for (int i = 0; i < 10; i++)
    j = j++;

Console.WriteLine(j);

9. А что будет выведено в результате такого цикла?

int end = int.MaxValue;
int begin = end - 100;
int counter = 0;

for (int i = begin; i <= end; i++)
    counter++;

Console.WriteLine(counter);

10. А такого?

float begin = 1000000000;
int counter = 0;

for (float i = begin; i < (begin + 10); i++)
    counter++;

Console.WriteLine(counter);

11. Какой же метод выберет компилятор?

class A { public void Test(int n) { Console.WriteLine("A"); } }
class B : A { public void Test(double n) { Console.WriteLine("B"); } }

static void Main(string[] args)
{
    B b = new B();
    b.Test(5);
}

12. А в этом случае?

public class Test
{
    public Test(object obj) { Console.WriteLine("object"); }
    public Test(int[] obj) { Console.WriteLine("int[]"); }
}

public static void Main() { Test t = new Test(null); }

13. Что будут выведено на экран в результате выполнения кода приведенного ниже?

List<int> list = new List<int>() { 1, 2, 3, 4, 5 };

List<int> all = list.FindAll(
i => { Console.Write(i); return i < 3; }
);

14. А такого кода?

List<int> list = new List<int>() { 1, 2, 3 };
var x = list.GroupBy(i => { Console.Write(i); return i; });
var y = list.ToLookup(i => { Console.Write(i); return i; });

15. И наконец, сложный вопрос из трех частей. Что будет выведено на экран в каждом из трех случаев, приведенных ниже:

А)

try {
    Console.WriteLine("Hello ");
    return;
}
finally { Console.WriteLine("Goodbye "); }
Console.WriteLine("world!");

Б)

try {
    Console.WriteLine("Hello ");
    Thread.CurrentThread.Abort();
}
finally { Console.WriteLine("Goodbye "); }
Console.WriteLine("world!");

В)

try {
    Console.WriteLine("Hello ");
    System.Environment.Exit(0);
}
finally { Console.WriteLine("Goodbye "); }
Console.WriteLine("world!");