विशिष्ट प्रश्न, तुमने ऐसा क्यों नहीं कर सकते
public class MyGenericClass<T>
{
T obj;
}
कारण यह है कि CLR एक भी संकलित करने के लिए सक्षम होने के लिए पसंद करती है है MyGenericClass के लिए कोड का संस्करण जो टी
के लिए निर्दिष्ट किसी संदर्भ प्रकार के लिए काम करेगा, यह दूसरे मामले के लिए ऐसा कर सकता है, क्योंकि यह T
कोके साथ चुपचाप बदल सकता हैऔर सम्मिलित उचित डाले, मोटे तौर पर के बराबर:
public class MyGenericClass
{
object obj;
}
लेकिन विरासत संस्करण के लिए, कि चाल काम नहीं करता।
इसके अलावा, कई उपयोगी सुविधाएं इंटरफ़ेस बाधाओं के माध्यम से वर्णन करना असंभव होगा। जब आप किसी प्रकार से उत्तराधिकारी होते हैं, तो आप केवल कॉल विधियों की तुलना में बहुत कुछ कर सकते हैं - आप उन्हें ओवरराइड भी कर सकते हैं। इस काल्पनिक उदाहरण पर विचार करें:
class MyBase
{
public virtual void MyVirtual() { }
}
class MyGenericDerived<T> : T
{
public override void MyVirtual()
{
Console.WriteLine("Overridden!");
}
}
MyBase obj = new MyGenericDerived<MyBase>();
obj.MyVirtual();
क्या मैं वहाँ एक "मिश्रण-इन", जहां MyGenericDerived आभासी कार्यों जो आधार में इसे करने के लिए लागू किया जाता है के लिए परिभाषाओं की आपूर्ति की तरह कुछ है करना चाहते हैं। लेकिन संकलक कैसे जानता है कि टी में MyVirtual नामक एक विधि होगी जिसे ओवरराइड किया जा सकता है? मुझे टी पर बाधा डालना होगा। मैं इसे इंटरफेस के माध्यम से कैसे व्यक्त करूं? यह नामुमकिन है। एक बार जब आप विरासत को टाइप पैरामीटर से अनुमति देते हैं तो बाधाओं का वर्णन करने के लिए इंटरफेस का उपयोग करना पर्याप्त समाधान नहीं है। तो यह एक और कारण है कि आज यह भाषा में क्यों मौजूद नहीं है।
स्रोत
2009-04-14 19:35:32
ऐसा करने की कोशिश करने के लिए आपकी प्रेरणा क्या है? –
सी # 4.0 में गतिशील प्रकार की प्रतीक्षा करें। –