Я использую VisualStudio 2017 в проекте, предназначенном для .NET Framework 4.6.1.
Играя с Task
, CancellationToken
и локальным методом, я пришел к такому коду:
class Program
{
static void Main(string[] args)
{
CancellationToken o;
Console.WriteLine(o);
}
}
Который компилируется. Теперь, если вы измените тип o
на int
или string
, он не будет компилироваться, выдавая ошибку:
Локальная переменная 'o' может быть не инициализирована перед доступом.
Я попытался декомпилировать CancellationToken
и скопировал код в структуру с именем MyCancellationToken
. Это тоже не скомпилируется.
Единственный случай, когда мне удалось скомпилировать, — это пустая структура или структура, содержащая CancellationToken
.
struct EmptyStruct
{
}
struct MagicStruct
{
public CancellationToken a;
}
class Program
{
static void Main(string[] args)
{
EmptyStruct a;
MagicStruct b;
Console.WriteLine(a);
Console.WriteLine(b);
}
}
- Почему
CancellationToken
не нуждается в инициализации? - Какие другие типы не нуждаются в инициализации?
Забавный факт: если вы смешаете это с локальной функцией, вы можете написать это:
class Program
{
static void Main(string[] args)
{
Work();
CancellationToken o;
void Work() => Console.WriteLine(o);
}
}
Который компилируется.
Span<T>
. Орас, можно ли закрыть этот вопрос как дубликат или вас интересуют некоторые вещи, на которые это не отвечает? - person   schedule 11.04.2018CancellationToken
не нужна инициализация? и почемуSpan<T>
не нуждается в инициализации? в основном один и тот же вопрос и имеют точно такой же ответ. - person   schedule 11.04.2018CancellationToken
не является пустой структурой. Имеет приватное поле ссылочного типа. - person   schedule 11.04.2018default
(для любого типа, типа значения или ссылочного типа). Поля структуры вообще не должны быть автоматически инициализированы. - person   schedule 11.04.2018CancellationToken
. - person   schedule 11.04.2018