5

私の関数では、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 に関するエラーが発生します - の場合と同じです。 IsNextEntityExistsnameof(IMediaPanel.IsNextEntityExists)

とにかく、私は答えを見つけました。この「ゲッター」エラーはReSharperのバグです(私自身の答えを参照してください)。

4

1 に答える 1

5

ReSharper のバグであることが判明しました。少なくとも、ReSharper が一時停止されているときはエラーが表示されず ([ツール] -> [オプション] -> [ReSharper Ultimate] -> [一時停止])、プロジェクトは Visual Studio にエラーが表示されていても正常にコンパイルされます。

私の現在のバージョンは次のとおりです。

  • JetBrains ReSharper Ultimate 10.0.2 ビルド 104.0.20151218.120627 (ReSharper 10.0.20151218.130009)
  • ビジュアル スタジオ 14.0.24720.0

アップデート

ReSharper チームにバグを送信する方法を探していたときに、彼らのトラッカーで非常によく似た問題を見つけました。クラスメンバーのプロパティについてですが、インターフェースと同じエラーが出るので、同じバグだと思います。ReSharper 10.1で修正されるとのことでした。

于 2016-03-04T11:19:10.320 に答える