.Net 接口继承编译



为什么会这样:

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

编译时 ?

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

从 CLR 的角度来看,这些是不同的类型,因为第一个是封闭泛型类型,继承自 IServiceRecherche<T, U>

但最终在执行过程中为什么它们不一样

原因是一样的,就像在以下情况下一样:

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

它们只是不同类型的声明,尽管具有类似的成员声明。

CLR 不能这样想:"啊,MyClass1 和 MyClass2 是相同的。让我们将它们视为同一类型"。

但是,

您可以使用鸭子类型将一个实例"投射"到另一个实例中。为此,您需要一个代表您的鸭子的类:

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

Rechercher -方法的调用在运行时而不是在编译时进行验证,从而防止您收到编译器错误。

使用该代码很简单:

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

有关如何使用dynamic关键字的详细信息,请参阅 MSDN:动态

最新更新