Компиляция свойств C#: get, set и методы

Суть задачи

Задача заключается в понимании компиляции кода со свойством, имеющим методы get и set, и одновременно определёнными методами с теми же именами. Такой код не компилируется.

Свойства как синтаксический сахар

Свойства C# — синтаксический сахар. Компилятор преобразует их в базовые конструкции языка.

Например, класс Sample со свойством Money (автоматическая реализация, get и private set) после компиляции станет полем и двумя методами: get_Money() и set_Money().

get_Money() возвращает int, а set_Money() принимает int в качестве параметра. Имя поля, генерируемого компилятором, может отличаться от имени свойства.

Конфликт имен

Если в классе, кроме свойства Money, определить методы getMoney() и setMoney() с аналогичными сигнатурами, возникнет конфликт имен. Компилятор уже сгенерировал get_Money() и set_Money(), поэтому явное определение методов с такими же именами приведёт к ошибке компиляции.

Метод get с типом void

Интересен аспект метода getMoney() с типом возвращаемого значения void. В C# это ошибка, поскольку метод get должен возвращать значение. В отличие от C#, некоторые языки (например, F#) допускают перегрузку методов по типу возвращаемого значения. C# перегружает методы только по списку параметров.

Использование ildasm

Для анализа скомпилированного кода можно использовать утилиту ildasm. Она позволяет просмотреть код в формате IL (Intermediate Language).

В C# свойства — синтаксический сахар, компилятор преобразует их в поля и методы доступа. Явное определение методов с именами, совпадающими с именами сгенерированных методов доступа к свойствам, приводит к конфликту имен и ошибке компиляции. Это важно учитывать при разработке кода и на технических собеседованиях. Следует также помнить о различиях в обработке перегрузки методов в разных языках программирования.

Что будем искать? Например,программа