Это гарантировано с точки зрения Fjuk
, но не Main
.
В Fjuk
возникает исключение после установки параметра.Хотя компилятором, джиттером и процессором могут быть переупорядочения, переупорядочения не будут такими, что порядок, наблюдаемый одним потоком, изменится.Поскольку один поток мог «заметить», что параметр не был установлен перед созданием исключения, параметр гарантированно будет установлен.
В Main
, однако мы не знаем деталей Fjuk
реализация, поэтому, когда компилятор анализирует Main
, это не может зависеть от этого.Следовательно, в варианте, в котором мы не присваиваем значение s
до вызова:
static void Main()
{
string s;
try
{
Fjuk(out s);
Console.WriteLine(s ?? "");//fine
}
catch (Exception)
{
Console.WriteLine(s ?? "");//compiler error
}
Console.WriteLine(s ?? "");//compiler error
}
Первая попытка использовать s
сразу после вызова Fjuk
- это нормально, потому чтоможет попасть туда только в случае успеха Fjuk
, а в случае успеха Fjuk
необходимо присвоить s
.Во втором и третьем случаях, тем не менее, можно прийти к этим строкам без успешного выполнения Fjuk
, и, поскольку анализом Main
невозможно определить, можно ли выдать исключение до установки s
, использование s
должно быть запрещено.