Использование ключевого слова nameof со свойством только для установки

В моей функции я получаю объекты, реализующие интерфейс IMediaPanel:

public interface IMediaPanel
{
    bool IsListsAreaVisible { get; }
    bool IsNextEntityExists { set; }
}

private void InitConnections(IMediaPanel panelControl)
{
    // Initialization logic
}

При инициализации мне нужно указать имена свойств, для чего я использую C# 6.0 nameof ключевое слово:

nameof(IMediaPanel.IsListsAreaVisible)

Это отлично работает, но с этим выражением:

nameof(IMediaPanel.IsNextEntityExists)

Visual Studio показывает мне следующую ошибку:

Свойство MyNamespace.IMediaPanel.IsNextEntityExists не имеет геттера.

Поиск по "имя ограничений" не дал мне никакого ответа по этой проблеме, более того, официальные комментарии не содержат ограничений относительно геттеров свойств:

... Стоит упомянуть следующее, что вызывает ошибки: предопределенные типы (например, int или void), типы, допускающие значение NULL (Point?), типы массивов (Customer[,]), типы указателей (Buffer*), квалифицированный псевдоним (A ::B) и несвязанные универсальные типы (Dictionary‹,>), символы предварительной обработки (DEBUG) и метки (loop:). ...

Может ли кто-нибудь объяснить, почему существует это ограничение и есть ли какие-либо упоминания об этом? Какая причина может заставить ключевое слово nameof использовать средство получения экземпляра свойства, в то время как оно должно (как я предполагаю) просто использовать информацию общего типа через Reflection? (по крайней мере, в этом конкретном случае, когда я не могу непосредственно указать на свойство экземпляра из-за неизвестного типа, я просто знаю, что этот экземпляр реализует интерфейс)

Обновлять

Чтобы объяснить, почему предложение @Gusdor из комментариев не работает, мне нужно уточнить, как я вызываю функцию InitConnections (в упрощенной форме):

public void Init(FrameworkElement panelControl)
{
    // ... Other logic ...
    this.InitConnections((IMediaPanel) panelControl);
}

Поэтому, если я использую nameof(panelControl.IsNextEntityExists) внутри функции Init, это приведет к ошибке, потому что FrameworkElement не содержит пользовательского свойства IsNextEntityExists клиента. И если я использую это же выражение внутри функции InitConnections, я получаю ошибку о геттере - так же, как и с nameof(IMediaPanel.IsNextEntityExists).

Во всяком случае, я нашел ответ, эта ошибка «геттера» является ошибкой ReSharper (см. Мой собственный ответ).


person Sam    schedule 04.03.2016    source источник
comment
nameof(panelControl.IsNextEntityExists) работает?   -  person Gusdor    schedule 04.03.2016
comment
Я не могу воспроизвести это - ваш точный код отлично работает для меня. Можете ли вы опубликовать минимально воспроизводимый пример?   -  person Jon Skeet    schedule 04.03.2016
comment
@Gusdor Нет, потому что я получаю panelControl как FrameworkElement. Физически это просто кастомный UserControl, созданный клиентом, который использует мой общий элемент управления. Каждый клиент создает свой собственный пользовательский элемент управления и передает его мне, поэтому мы общаемся через интерфейс.   -  person Sam    schedule 04.03.2016
comment
Я запутался, ваш метод инициализации принимает IMediaPanel, и вы заявляете, что вам нужны имена во время инициализации - Во время инициализации мне нужно указать имена свойств   -  person Gusdor    schedule 04.03.2016
comment
@Gusdor Мне нужно указать имя, например nameof(ClientUserControl1.IsNextEntityExists) или nameof(ClientUserControl2.IsNextEntityExists), но я не могу знать, какой конкретный тип клиента передаст мне, потому что клиенты используют мой элемент управления как службу, а не наоборот. Все, что я знаю внутри своего элемента управления, это соглашение о том, что они должны реализовать этот конкретный интерфейс.   -  person Sam    schedule 04.03.2016
comment
@JonSkeet Я даже не подумал нажать кнопку «Сборка», глядя прямо на сообщение об ошибке ... поэтому я собираю и компилирую проект. Более того, программа на данный момент работает как надо. Итак, мое первое подозрение для всех, кто пытался воспроизвести: на вашей визуальной студии установлен ReSharper?   -  person Sam    schedule 04.03.2016
comment
@Sam: я даже не был в Visual Studio - просто компилировал из командной строки :)   -  person Jon Skeet    schedule 04.03.2016


Ответы (1)


Оказалось ошибка ReSharper, по крайней мере ошибка не отображается, когда ReSharper приостановлен (Инструменты -> Параметры -> ReSharper Ultimate -> Приостановить сейчас), и проект успешно компилируется даже с ошибками, отображаемыми в Visual Studio.

Мои текущие версии:

  • JetBrains ReSharper Ultimate 10.0.2 сборка 104.0.20151218.120627 (ReSharper 10.0.20151218.130009)
  • Visual Studio 14.0.24720.0

Обновлять

Пока я искал, как сообщить об ошибках команде ReSharper, я обнаружил очень похожую проблему в своем трекере. Речь идет о свойстве члена класса, но оно дает мне ту же ошибку, что и с моим интерфейсом, поэтому я считаю, что это та же ошибка. Там сказали, что это будет исправлено в ReSharper 10.1.

person Sam    schedule 04.03.2016