2017-02-01 6 views
4

Рассмотрим следующую структуру в C#:Отсутствие ошибок компиляции при работе с структура и свойства

public struct TestStruct 
{ 
    public int Number { get; set; } 

    public TestStruct(int num) 
    { 
     Number = num; 
    } 
} 

Я очень хорошо знаком с ошибкой компиляции, которая возникает, если один пытается собрать это (this и that вопросы обеспечения пример).

Однако, я недавно заметил, что такая структура составлена ​​отлично в Visual Studio 2015.

Я не смог найти какой-либо журнал изменений для компилятора, который будет включать в себя вышеупомянутое поведение. Может ли кто-нибудь дать какие-либо указания относительно того, где найти такую ​​информацию? Я нашел упоминания о чем-то подобном here.

Кроме того, страница об ошибке компилятора CS0188 состояние:

Auto-реализованных свойств следует избегать структур, потому что они не имеют поля подложки и, следовательно, не могут быть инициализированы в любом случае из конструктора.

Однако я не смог заметить невозможность инициализировать свойство из конструктора.

ответ

4

Это новое в C# 6 (это то, что вы будете использовать по умолчанию в VS2015). Описание этой ошибки компилятора также не является правильным. У авто-свойств всегда было поле поддержки, оно просто генерируется компилятором, а не иначе, напрямую доступным из кода. Так что это немного вводит в заблуждение.

Изменения в инициализации автоистории в C# теперь позволяют компилятору генерировать код для установки поля резервного копирования, а не пытаться вызвать метод setter в конструкторе. Это также делает его гораздо проще создавать неизменные: Структуры

public struct Foo 
{ 
    public string ReadOnlyString { get; } 

    public Foo(string prop) 
    { 
     ReadOnlyString = prop; 
    } 
} 
+0

Я забыл упомянуть, что я попытался установить различные языковые версии для проекта, и она прекрасно работает даже с C# 4. Например вы предоставили Безразлично работайте с C# 4, как и ожидалось. Мне кажется, что это проблема компилятора, а не язык. Во всяком случае, это кажется логичным, но я не понимаю, почему это нигде не упоминалось и не было представлено в разделе, посвященном инициализации свойств для C# 6. –

+1

@ vlad.stryapko Изменение языковой версии не совсем так, как вы думаете оно делает. Установка разных версий компилятора изменяет только тот синтаксис, который примет компилятор. Он не меняет способ работы компилятора. См. [Этот вопрос] (http://stackoverflow.com/questions/29476057/how-to-compile-c-sharp-with-specific-language-version). – Kyle

+0

Итак, правильно ли я понял, что для поддержки свойств только для чтения в C# 6 изменения были внесены в компилятор, который заставлял его работать по-другому и напрямую устанавливал поле, поэтому не поднимал ошибку? –