С# Структуры: непризнанная локальная переменная?

В документации :

В отличие от классов, структуры могут быть созданы без использования нового оператора.

Так почему я получаю эту ошибку:

Использование неназначенной локальной переменной 'x'

Когда я пытаюсь это сделать?

        Vec2 x;
        x.X = det * (a22 * b.X - a12 * b.Y);
        x.Y = det * (a11 * b.Y - a21 * b.X);

Где Vec2 x - это структура?

Ответы

Ответ 1

Ну, есть свойства X и Y (а не поля)? Если да, то проблема. Пока все поля в x не будут назначены, вы не сможете вызвать какие-либо методы или свойства.

Например:

public struct Foo
{
    public int x;
    public int X { get { return x; } set { x = value; } }
}

class Program
{
    static void Main(string[] args)
    {
        Foo a;
        a.x = 10; // Valid

        Foo b;
        b.X = 10; // Invalid
    }
}

Является ли Vec2 вашим собственным типом? У вас есть доступ к соответствующим полям или только к свойствам?

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

Я лично предоставил struct конструктор, принимающий X и Y:

 Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y),
                   det * (a11 * b.Y - a21 * b.X));

Ответ 2

Он все еще неинициализирован. Перед его использованием необходимо инициализировать его. Вы можете использовать для этого оператор default, если вы не хотите создавать статическое значение Vec.Empty и довольны значениями по умолчанию для членов structs:

Vec2 x = default(Vec2);

Митч Пшеница:

Это, однако, не означает:

public struct Vec2
{
    int x;
    int y;

   public float X { get { return x; } set { x = value; } }
   public float Y { get { return y; } set { y = value; } }

}
static void Main(string[] args)
{
    Vec2 x;

    x.X = 1;
    x.Y = 2; 
}

Компилятор не позволяет вам вызвать propertis для типов до того, как все его члены будут инициализированы, хотя свойство может просто установить одно из значений. Решение, предложенное Джоном Скитом, состоит в том, чтобы иметь инициализирующий конструктор и, предпочтительно, нет сеттеров.