Ошибка при построении структуры в С#

Извините за общий заголовок, я действительно не понимаю ошибку, которую я получаю.

Итак, я следую этому руководству по C# и готов раздел «Структуры и управление памятью».

Примерно в 5:30 он начинает создавать Color Struct, поэтому я следую ему, строка за строкой. Все это время его код не показывает ошибок.

Мои ошибки

Однако у меня есть. Четыре из них, если быть точным:

1) Error 1: Backing field for automatically implemented property 'Color.R' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

Ошибки 2 и 3 такие же, как и 1, за исключением замены Color.R на Color.G и Color.B.

Наконец, ошибка 4:

The 'this' object cannot be used before all of its fields are assigned to.

Код

Вот мой код для моей структуры Color (опять же, я изо всех сил пытаюсь заметить разницу между моим кодом и кодом мастера учебника):

public struct Color
{
    public byte R { get; private set; }
    public byte G { get; private set; }
    public byte B { get; private set; }

    public Color(byte red, byte green, byte blue)
    {
        R = red;
        G = green;
        B = blue;
    }

    public static Color Red
    {
        get { return new Color(255, 0, 0); }
    }

    public static Color Green
    {
        get { return new Color(0, 255, 0); }
    }

    public static Color Blue
    {
        get { return new Color(0, 0, 255); }
    }

    public static Color Black
    {
        get { return new Color(0, 0, 0); }
    }

    public static Color White
    {
        get { return new Color(255, 255, 255); }
    }
}

Я совершенно новичок в С#, но имею некоторый опыт работы с PHP, поэтому я немного смущен тем, что именно здесь происходит. Мысли?


person ReactingToAngularVues    schedule 21.01.2014    source источник


Ответы (1)


Structs может действительно использовать конструктор по умолчанию только для первоначальной сборки. Измените свой конструктор, чтобы он вызывал значение по умолчанию:

public Color(byte red, byte green, byte blue)
    : this() 
{
    this.R = red;
    this.G = green;
    this.B = blue;
}

Вызывая this, вы используете конструктор по умолчанию, а затем устанавливаете частные значения для этого конкретного экземпляра. Если бы это был class вместо struct, ваш код работал бы без проблем.

person JNYRanger    schedule 21.01.2014
comment
Отлично, спасибо за помощь. - person ReactingToAngularVues; 21.01.2014