Структуры C#: Неприсвоенная локальная переменная?

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

В отличие от классов, структуры можно инстанцировать, не используя новый оператор.

Итак, почему я получающий эту ошибку:

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

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

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

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

20
задан mpen 15 January 2010 в 04:02
поделиться

2 ответа

Ну, являются свойствами 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
    }
}

IS VEC2 Ваш собственный тип? У вас есть доступ к включенным полям или только свойствам?

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

Я бы лично дал структуру конструктора, принимаю X и Y:

 Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y),
                   det * (a11 * b.Y - a21 * b.X));
24
ответ дан 30 November 2019 в 00:22
поделиться

, он все еще неинициализирован. Вам нужно инициализировать его, прежде чем использовать его. Вы можете использовать Default Default Оператор для этого, если вы не хотите создавать статические vec.empty значение и довольны значениями по умолчанию для членов структуре:

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 на типы до того, как все его члены инициализированы, даже если свойство может просто установить одно из значений. Решение, как предложил Джон Скелет, должен иметь инициализацию конструктора и предпочтительно нет больных.

9
ответ дан 30 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: