4

どうしてこれなの :

public interface IServiceRecherche<T, U>
                    where T : IEntite
                    where U : ICritereRecherche
{
    IList<T> Rechercher(U critere);
}

public interface IServiceRechercheUnite :
                        IServiceRecherche<IUnite, ICritereRechercheUnite>,

{}

と違う :

public interface IServiceRechercheUnite                             
{
    IList<IUnite> Rechercher(ICritereRechercheUnite critere);
}

コンパイル時?

最初のインターフェイスでコンパイルされたアプリケーションは、2 番目のインターフェイスを認識できませんでした。コードでは同じではないことはわかっていますが、最終的に実行中に同じではないのはなぜですか?

4

2 に答える 2

2

CLR の観点からは、これらは異なる型です。最初の型は から継承されたクローズド ジェネリック型であるためIServiceRecherche<T, U>です。

しかし、最終的に実行中になぜそれらは同じではないのですか

理由は、次の場合と同じです。

public MyClass1
{
  public int MyProperty { get; set; }
}

public MyClass2
{
  public int MyProperty { get; set; }
}

似たようなメンバー宣言があるにもかかわらず、それらは単なる異なる型宣言です。

CLR では、「ああ、MyClass1 と MyClass2 は同じです。同じ型と見なしましょう」という考え方はできません。

于 2012-09-17T06:45:44.360 に答える
0

ただし、ダックタイピングを使用して、あるインスタンスを別のインスタンスに「キャスト」できます。これには、アヒルを表すクラスが必要です。

public class LooksLikeAnIServiceRecherche : IServiceRecherche<IUnite, ICritereRechercheUnite>
{
    private readonly dynamic _duck;

    public LooksLikeAnIServiceRecherche (dynamic duck)
    {
        this._duck = duck;
    }

    public IList<IUnite> Rechercher(ICritereRechercheUnite critere)
    {
        return this._duck.Rechercher(critere);
    }
}

-methodの呼び出しはRechercher、コンパイル時ではなく実行時に検証されるため、受け取ったコンパイラ エラーを防ぐことができます。

そのコードを使用するのは簡単です:

IServiceRechercheUnite rechercheUnite;
var serviceRecherche = new LooksLikeAnIServiceRecherche(rechercheUnite);

-キーワードの使用方法の詳細については、MSDN: dynamicdynamicを参照してください。

于 2012-09-17T08:21:36.117 に答える