为什么以下产生编译器错误:
public interface OwnSession : ISession { }
[...]
OwnSession s = SessionFactory.OpenSession(); // compiler error (in german unfortunately)
[...]
“SessionFactory”在“OpenSession()”(NHibernate)上返回“ISession”
答案 0 :(得分:10)
你应该投射结果:
OwnSession s = (OwnSession) SessionFactory.OpenSession();
如果OpenSession()返回一个ISession类型,它可能是任何实现ISession的东西,所以你必须告诉编译器你期望一个 OwnSession 类型(只有你确定它会返回它的类型)当然)
另一方面,您可以将变量声明为ISession,并继续使用它。除非您想使用 OwnSession 类型中的方法或属性,这些方法或属性在ISession接口规范中不可用。
答案 1 :(得分:5)
返回的对象只是“ISession”,它不是“OwnSession”(顺便说一句,你应该在它前面添加I:IOwnSession)。想象一下,你有一个函数返回一个汉堡,你不能把它作为一个cheesburger,因为它可能不是一个......
答案 2 :(得分:1)
我猜是因为OwnSession可能比ISession更大/更不同?
想象一下,如果OwnSession继承自ISession但又添加了另一个方法签名..那么SessionFactory.OpenSession方法返回的ISession将与OwnSession定义的契约相匹配(或者它可以但不一定取决于实际的具体类型返回...编译器不知道那个)
答案 3 :(得分:0)
SessionFactory.OpenSession调用将返回一个实现ISession接口的对象,但您的OwnInterface更具体。施法可能是其中一种方法,或直接与ISession合作......