全部,
我有以下類定義:
public class SessionScope<TSession> : ISessionScope<TSession>
where TSession : class, IStatefulSession
{
private TSession _session; // Constraint as IStatefulSession
}
那為什么我不能做這個演員:
_session = HibernateContext.Current.AcquireNewSession(); // AcquireNewSession() returns IStatefulSession
這是編譯器訊息:無法將型別“xxx.Persistence.IStatefulSession”隱式轉換為“TSession”。存在顯式轉換(您是否缺少演員表?)
但我可以這樣做:
_session = (TSession)HibernateContext.Current.AcquireNewSession();
uj5u.com熱心網友回復:
有關更多資訊,請查看https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance
簡短的版本基本上是AcquireNewSession回傳一個 interface IStatefulSession,它比TSession實作該介面的類更不具體。
您必須將不太具體的型別顯式轉換為更具體的型別,這是可能的,因為給定的約束。
然而,換一種方式總是好的,因為我們總是可以將更具體的型別分配給不太具體的型別。
這與您始終可以將 a 分配string給變數的原因基本相同,但是如果要將其分配給object變數,則必須顯式強制轉換。objectstring
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/460960.html
