Как работает добавление к пустой строке в C #?

Я был удивлен, увидев пример строки, инициализированной нулем, а затем добавленной к ней в производственной среде. Это просто пахло неправильно.

Я был уверен, что это вызвало бы исключение нулевого объекта, но этот сильно сокращенный пример также работает:

string sample = null;
sample += "test";
// sample equals "test"

*Обратите внимание, что исходный код, который я нашел, устанавливает свойство строки в null и добавляет его в другом месте, поэтому ответы с участием компилятора, оптимизирующего null во время компиляции, не имеют значения.

Может кто-нибудь объяснить, почему это работает без ошибок?

Следовать за:

Основываясь на ответе Леппи, я использовал Reflector, чтобы увидеть, что находится внутри string.Concat. Теперь действительно очевидно, почему происходит это преобразование (вообще никакой магии):

public static string Concat(string str0, string str1)
{
    if (IsNullOrEmpty(str0))
    {
        if (IsNullOrEmpty(str1))
        {
            return Empty;
        }
        return str1;
    }
    if (IsNullOrEmpty(str1))
    {
        return str0;
    }
    int length = str0.Length;
    string dest = FastAllocateString(length + str1.Length);
    FillStringChecked(dest, 0, str0);
    FillStringChecked(dest, length, str1);
    return dest;
}

**Примечание: конкретная реализация, которую я исследовал (в библиотеке .Net от Microsoft), не преобразуется в пустые строки, как это предусмотрено стандартами C # и большинством ответов, но использует несколько тестов для сокращения процесса. Конечный результат такой же, как если бы это было так, но вы идете :)

Ответы на вопрос(4)

Ваш ответ на вопрос