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