C # Structs: неназначенная локальная переменная? - PullRequest
20 голосов
/ 15 января 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

23 голосов
/ 15 января 2010

Ну, а свойства 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));
9 голосов
/ 15 января 2010

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

Vec2 x = default(Vec2);

Mitch Wheat:

Однако это не так:

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; 
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...