के प्रकार को लागू करने के दौरान सामान्य प्रकार "टी के रूप में" कास्टिंग करना मुझे लगता है कि मुझे लगता है कि यह एक चाल है और मुझे विश्वास नहीं है कि मैंने पहले कभी नहीं किया है। हालांकि, मैं कीवर्ड के रूप में एक सामान्य प्रकार का उपयोग कैसे कर सकता हूं?टी
[Serializable]
public abstract class SessionManager<T> where T : ISessionManager
{
protected SessionManager() { }
public static T GetInstance(HttpSessionState session)
{
// Ensure there is a session Id
if (UniqueId == null)
{
UniqueId = Guid.NewGuid().ToString();
}
// Get the object from session
T manager = session[UniqueId] as T;
if (manager == null)
{
manager = Activator.CreateInstance<T>();
session[UniqueId] = manager;
}
return manager;
}
protected static string UniqueId = null;
}
लाइन T manager = session[UniqueId] as T;
निम्न त्रुटि फेंकता है:
The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint
अब, मुझे लगता है कि इस का कारण समझ में; मैंने भौतिक रूप से संकलक को नहीं बताया है कि टी एक वर्ग है। अगर मैं बदल देते हैं:
public abstract class SessionManager<T> where T : ISessionManager
public abstract class SessionManager<T> where T : class
साथ ... तो कोड सफलतापूर्वक बनाता है।
लेकिन मेरा प्रश्न इस प्रकार है; मैं सामान्य प्रकार पर कक्षा और ISessionManager प्रवर्तन दोनों कैसे हो सकता है? मुझे आशा है कि इसके लिए एक बहुत ही सरल जवाब है।
संपादित करें: बस जोड़ने के लिए मैं कोशिश की थी: where T : ISessionManager, class
, पता चला है कि मैं अपने संकलक त्रुटि को ठीक से नहीं पढ़ी थी। बस पर्याप्त है, ISessionManager
से पहले वर्ग डालने से समस्या ठीक हो जाती है। त्रुटि जो मैंने नहीं पढ़ी थी:
"The 'class' or 'struct' constraint must come before any other constraints".
गूंगा पल खत्म हो गया।
BTW, आप उपयोग नहीं करना चाहिए। आपको 'नई()' बाधा जोड़नी चाहिए और कोड में 'नया टी() 'का उपयोग करना चाहिए। –
कभी नहीं जानता था! धन्यवाद। – GenericTypeTea