Различия между структурами, созданными пользователем, и структурами фреймворка в .NET - PullRequest
7 голосов
/ 24 ноября 2010

Почему компилятор C # не позволяет вам скомпилировать это:

int a;
Console.WriteLine(a);

но позволяет вам скомпилировать:

MyStruct a;
Console.WriteLine(a);

где MyStruct определяется как:

struct MyStruct
{

}

Обновление: в первом случае ошибка:

Ошибка 1 Использование неназначенного локального переменная 'a'

Ответы [ 3 ]

11 голосов
/ 24 ноября 2010

C # не позволяет читать с неинициализированных местных жителей.Вот выдержка из спецификации языка , которая применяется в этом контексте:

5.3 Определенное присваивание

...

Переменная типа структурысчитается определенно назначенным , если каждая из его переменных экземпляра считается определенно назначенным.


Очевидно, поскольку ваша структура не имеет полей, это не проблема;это считается определенно назначенным.Добавление поля к нему должно нарушить сборку.

На несколько связанном примечании:

11.3.8 Конструкторы

Никакая функция-член экземпляра не может быть вызвана, пока всеполя конструируемой структуры определенно назначены.

4 голосов
/ 24 ноября 2010

Это происходит потому, что локальная переменная int (в отличие от int в качестве члена класса или структуры) не имеет значения по умолчанию.Вывод struct в вашем примере работает только потому, что в нем нет членов.

Обсуждаются значения по умолчанию здесь .

Это будет работать:

struct MyStruct
{
    int c;
}

int a = new int();
MyStruct b = new MyStruct();

Console.WriteLine(a);
Console.WriteLine(b);
2 голосов
/ 24 ноября 2010

Компилятору просто не нравится тот факт, что ваше целое число используется перед инициализацией.

Error   5   Use of unassigned local variable 'a'    
...