0

メンバーの戻り値の型に関してジェネリックを作成したいインターフェイスがあります。

したがって、非汎用インターフェースが次の場合:

interface IViewHolder{
  IView View {get;}
}

そして私は欲しい

interface IViewHolder<TView> : IViewHolder {
 where TView : class, IView
  TView View {get;}
}

IViewHolder<T>IViewHolder が必要な場所ならどこでも使用できるように、ジェネリックの View メンバーに new キーワードを使用する必要があります。そうしないと、コンパイルされません。

これは「正しくない」ように思われるので、MS がリフレクターを使用してフレームワークでそれを行う方法を調べました。

したがって、IEnumerable<T>彼らは次のことを行います。

[TypeDependency("System.SZArrayHelper"), __DynamicallyInvokable]
public interface IEnumerable<out T> : IEnumerable
{
    [__DynamicallyInvokable]
    IEnumerator<T> GetEnumerator();
}

新しいキーワードは必要ありません。それで、彼らの秘密は何ですか。

4

2 に答える 2

2

これは「正しくない」ように思われるので、MS がリフレクターを使用してフレームワークでそれを行う方法を調べました。

IL レベルでは、これら 2 つのことは同一です。実際、リフレクターの有無にかかわらず同じ IL にコンパイルされるnewので、リフレクターはちょっと正しいです。ここで行う唯一のことnew、コンパイラに「ここで何をしているのか知っています - 警告を追加しないでください」と伝えることです - 具体的には:

警告 {x} は、継承されたメンバー {y} を非表示にします。非表示が意図されている場合は、new キーワードを使用します。

IL出力は変化しません。リフレクターが事前の宣言をチェックする手間を省き、それを明確にするためにを追加するとよいでしょう。new

于 2013-09-10T08:53:34.230 に答える
0

コンパイラからのエラーメッセージを教えてください。

これは単なる警告であり、コンパイルを妨げるものではないと思います。

于 2013-09-10T08:53:42.143 に答える