私の関数では、IMediaPanel
インターフェイスを実装するオブジェクトを受け取ります。
public interface IMediaPanel
{
bool IsListsAreaVisible { get; }
bool IsNextEntityExists { set; }
}
private void InitConnections(IMediaPanel panelControl)
{
// Initialization logic
}
nameof
初期化中に、C# 6.0キーワードを使用しているプロパティの名前を指定する必要があります。
nameof(IMediaPanel.IsListsAreaVisible)
これは問題なく機能しますが、次の式を使用します。
nameof(IMediaPanel.IsNextEntityExists)
Visual Studio で次のエラーが表示されます。
プロパティ「MyNamespace.IMediaPanel.IsNextEntityExists」にはゲッターがありません。
「制限の名前」を検索しても、この問題についての答えは得られませんでした。さらに、公式の発言には、プロパティ ゲッターに関する制限が含まれていません。
... 以下は、エラーを生成することに言及する価値があります: 事前定義された型 (int または void など)、null 許容型 (Point?)、配列型 (Customer[,])、ポインター型 (Buffer*)、修飾エイリアス (A ::B)、バインドされていないジェネリック型 (Dictionary<,>)、前処理シンボル (DEBUG)、およびラベル (ループ:)。...
この制限がある理由と、それについての参照があるかどうかを誰かが説明できますか? nameof
リフレクションを介して一般的な型情報を使用する必要があるのに、キーワードがプロパティのインスタンスゲッターを使用するように強制できる理由は何ですか? (少なくともこの特定のケースでは、不明な型のためにインスタンスのプロパティを直接指すことができない場合、このインスタンスがインターフェイスを実装していることを知っているだけです)
アップデート
コメントからの@Gusdorの提案が機能しない理由を説明するには、InitConnections
関数を呼び出す方法を明確にする必要があります(簡略化された形式で):
public void Init(FrameworkElement panelControl)
{
// ... Other logic ...
this.InitConnections((IMediaPanel) panelControl);
}
そのため、 Initnameof(panelControl.IsNextEntityExists)
関数内で使用すると、FrameworkElement にカスタム クライアントのプロパティが含まれていないため、エラーが発生します。また、 InitConnections関数内で同じ式を使用すると、getter に関するエラーが発生します - の場合と同じです。 IsNextEntityExists
nameof(IMediaPanel.IsNextEntityExists)
とにかく、私は答えを見つけました。この「ゲッター」エラーはReSharperのバグです(私自身の答えを参照してください)。