为什么会这样:
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:动态