Използване на ключова дума nameof със свойство set-only

В моята функция получавам обекти, изпълняващи 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“ няма метод за получаване.

Търсенето на „nameof limitations“ не ми даде никакъв отговор за този проблем, освен това официалните забележки не съдържат ограничение относно property getters:

... Струва си да се спомене следното, което създава грешки: предварително дефинирани типове (например int или void), nullable типове (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).

Както и да е, намерих отговора, тази грешка „getter“ е грешка на 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
Объркан съм, вашият init метод приема IMediaPanel и вие заявявате, че имате нужда от имената по време на init - По време на инициализацията трябва да посоча имена на свойства   -  person Gusdor    schedule 04.03.2016
comment
@Gusdor Трябва да посоча име като nameof(ClientUserControl1.IsNextEntityExists) или nameof(ClientUserControl2.IsNextEntityExists), но не мога да знам какъв конкретен тип клиент ще ми предаде, тъй като клиентите използват моя контрол като услуга, но не и обратното. Всичко, което знам в моя контрол, е конвенцията, че те трябва да внедрят този конкретен интерфейс.   -  person Sam    schedule 04.03.2016
comment
@JonSkeet Дори не се сетих да натисна бутона Build, докато гледах директно към съобщението за грешка... така че изграждам и компилирам проекта. Освен това програмата в момента работи както трябва. И така, първото ми подозрение за всички, които се опитаха да възпроизведат: инсталиран ли е 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 Build 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