Что не так с определением этого типа структуры - PullRequest
6 голосов
/ 11 октября 2011

Я определил свою структуру следующим образом:

struct Test
{
    private string assayName;
    public string AssayName { get; set; }

    private string oldUnitName;
    public string OldUnitName { get; set; }

    private string newUnitName;
    public string NewUnitName { get; set; }

    public Test(string name, string oldValue, string newValue)
    {
        assayName = name;
        oldUnitName = oldValue;
        newUnitName = newValue;
    }

}

но выдает следующую ошибку:

"Ошибка 13 Поле поддержки для автоматически реализуемого свойства 'EnterResults.frmApplication.Test.NewUnitName' должен быть полностью назначен до того, как управление возвращается вызывающему. Рассмотрите возможность вызова по умолчанию конструктор из инициализатора конструктора. "

Ответы [ 5 ]

6 голосов
/ 11 октября 2011

Что ж, на самом деле есть две проблемы:

1.Вы используете автоматические свойства, но также предоставляя поля, между ними нет разводки.свойства, потому что это структура, они должны быть инициализированы в первую очередь.Вы можете сделать это с помощью вызова конструктора по умолчанию.Таким образом, пересмотренная версия будет:

struct Test
{
    public Test(string name, string oldValue, string newValue)
        : this()
    {
        AssayName = name;
        OldUnitName = oldValue;
        NewUnitName = newValue;
    }

    public string AssayName { get; private set; }
    public string OldUnitValue { get; private set; }
    public string NewUnitValue { get; private set; }
}
6 голосов
/ 11 октября 2011

Вы ничего не делаете со свойствами.Попробуйте это:

struct Test 
{ 
    public string AssayName { get; set; } 
    public string OldUnitName { get; set; } 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) : this()
    { 
        AssayName = name; 
        OldUnitName = oldValue; 
        NewUnitName = newValue; 
    } 
} 

Я думаю, что это связано с инициализацией структуры.Обратите внимание, что вызов конструктора по умолчанию, который я добавил, кажется, делает его счастливым:)

«Кажется, что делает его счастливым» - насколько это глупо.Я искал реальный ответ, который связан с тем, как инициализируются структуры.Вызов конструктора по умолчанию обеспечивает инициализацию полей перед использованием структуры.

3 голосов
/ 11 октября 2011

Вы можете удалить поля private assayName, oldUnitName и newUnitName. Затем вы ссылаетесь на автоматически реализованные свойства в вашем конструкторе:

public Test(string name, string oldValue, string newValue)
{
    AssayName = name;
    OldUnitName = oldValue;
    NewUnitName = newValue;
}
2 голосов
/ 11 октября 2011

Вы также можете вызвать конструктор по умолчанию:

public Test(string name, string oldValue, string newValue) : this() 
{
   assayName = name;
   oldUnitName = oldValue;
   newUnitName = newValue;
}

См. здесь

2 голосов
/ 11 октября 2011

Вы пытаетесь создать Автоматически Реализуемое Свойство , но вы определяете «Вспомогательные поля» (которые явно не используются), а затем присваиваете значения этим вспомогательным полям в конструкторе.и оставляя ваши свойства совершенно нетронутыми.

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