нет конструктора по умолчанию и автоматического свойства, почему он все еще компилируется - PullRequest
2 голосов
/ 03 июня 2019

Я новичок в C #, просто вопрос о конструкторе по умолчанию и автоматических свойствах. Основываясь на вопросе о стеке потока: Как установить значение вспомогательных полей авто свойства в конструкторе структуры?

поэтому мы имеем следующую структуру

public struct SomeStruct
{
   public SomeStruct(String stringProperty, Int32 intProperty)
   {
      this.StringProperty = stringProperty;
      this.IntProperty = intProperty;
   }
   public String StringProperty { get; set; }
   public Int32 IntProperty { get; set; }
}

но почему он прекрасно скомпилируется без вызова конструктора по умолчанию :this()? Другой вопрос: почему это правило не распространяется на классы? у вас может быть автоматическое свойство без конструктора по умолчанию?

1 Ответ

5 голосов
/ 03 июня 2019

В конечном счете, структуры имеют строгие правила для определенного присваивания, прежде чем их можно будет использовать как целое значение (необходимо для доступа this);до C # 6 компилятор не рассматривал авто-свойства в конструкторах как часть определенного присваивания, поэтому доступ к вызову установщика свойств считался недействительным.Начиная с C # 6, это так (рассматривайте авто-свойства как часть определенного присваивания в конструкторах структуры), поэтому код, как показано, теперь действителен.

Поскольку он действителен (с любым недавним компилятором, дажеесли вы устанавливаете уровень языка раньше, чем C # 6), он компилируется.

Обратите внимание, однако, что этот только применяется внутри конструкторов.Следующее остается недействительным (хотя это будет работать с открытыми полями):

SomeStruct x;
x.StringProperty = "abc"; // CS0165 Use of unassigned local variable x
x.IntProperty = 123;
SomeMethod(x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...