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);
}

什么时候编译?

使用第一个接口编译的应用程序无法识别第二个接口。我知道它们在代码中不一样,但最终在执行过程中为什么它们不一样?

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);

有关如何使用dynamic-keyword 的更多信息,请参阅MSDN:动态

于 2012-09-17T08:21:36.117 回答