मैंने सोचा था कि जेनिक्स इन सी # को इस तरह कार्यान्वित किया गया था कि एक नई कक्षा/विधि/जो-आप-उत्पन्न हुई थी, या तो रन-टाइम या संकलन-समय पर, जब एक नया सामान्य प्रकार का उपयोग किया गया था, सी ++ टेम्पलेट्स के समान (जिसे मैंने वास्तव में कभी नहीं देखा है और मैं बहुत अच्छा हो सकता हूं, जिसके बारे में मैं खुशी से सुधार स्वीकार करता हूं)।सी # जेनेरिक कैसे लागू किए जाते हैं?
static class Program {
static void Main()
{
Test testVar = new Test();
GenericTest<Test> genericTest = new GenericTest<Test>();
int gen = genericTest.Get(testVar);
RegularTest regTest = new RegularTest();
int reg = regTest.Get(testVar);
if (gen == ((object)testVar).GetHashCode())
{
Console.WriteLine("Got Object's hashcode from GenericTest!");
}
if (reg == testVar.GetHashCode())
{
Console.WriteLine("Got Test's hashcode from RegularTest!");
}
}
class Test
{
public new int GetHashCode()
{
return 0;
}
}
class GenericTest<T>
{
public int Get(T obj)
{
return obj.GetHashCode();
}
}
class RegularTest
{
public int Get(Test obj)
{
return obj.GetHashCode();
}
}
}
उन सांत्वना लाइनों प्रिंट की
दोनों:
लेकिन मेरे कोडिंग में मैं एक सटीक counterexample के साथ आया था।
मुझे पता है कि वास्तविक कारण यह होता है कि ऑब्जेक्ट.गेटहाशकोड() को वर्चुअल कॉल टेस्ट.गेटहाशकोड() को हल नहीं करता है क्योंकि टेस्ट में विधि को ओवरराइड के बजाय नए के रूप में चिह्नित किया जाता है। इसलिए, मुझे पता है कि मैंने टेस्ट पर "नया" के बजाय "ओवरराइड" का उपयोग किया था। गेटशैशकोड() तो 0 की वापसी पॉलिमॉर्फिक विधि में GetHashCode विधि को ओवरराइड करेगा और यह सच नहीं होगा, लेकिन मेरी (पिछली) समझ के अनुसार सी # जेनेरिकों में यह mattered नहीं होगा क्योंकि टी के हर उदाहरण टेस्ट के साथ बदल दिया गया होगा, और इस प्रकार विधि कॉल स्थिर रूप से (या सामान्य संकल्प समय पर) "नई" विधि के लिए हल किया गया होगा।
तो मेरा प्रश्न यह है: सी # में जेनेरिक कैसे लागू किए जाते हैं? मुझे सीआईएल बाइटकोड नहीं पता है, लेकिन मुझे जावा बाइटकोड पता है, इसलिए मैं समझता हूं कि ऑब्जेक्ट उन्मुख सीएलआई भाषाएं निम्न स्तर पर कैसे काम करती हैं। उस स्तर पर व्याख्या करने के लिए स्वतंत्र महसूस करें।
एक के रूप में अलग रूप में, मैंने सोचा था कि क्योंकि हर कोई हमेशा सी # में जेनेरिक प्रणाली "ट्रू जेनेरिक्स," जावा के प्रकार-विलोपन प्रणाली की तुलना में कॉल सी # जेनरिक कि जिस तरह से लागू किया गया।
यहां 'gen == ((ऑब्जेक्ट) testVar ऑब्जेक्ट करने के लिए डालने का कोई कारण) .GetHashCode()'? – AlwaysAProgrammer
हालांकि यह सीधे आपके प्रश्न का उत्तर नहीं देता है, http://blogs.msdn.com/b/ericlippert/archive/2012/07/10/when-is-a-cast-not-a-cast.aspx कुछ अच्छा है जेनेरिक कैसे डाले जाते हैं और सी # में एक-दूसरे से कैसे संबंधित होते हैं, इस बारे में जानकारी। – devstruck
@Yogendra ऐसा तक पहुँचता है 'नई' विधि Test.GetHashCode() विधि के बजाय Object.GetHashCode()। यही कारण है कि यह एक अलग मूल्य देता है (क्योंकि यह पूरी तरह से एक अलग विधि चलाता है)। – Carrotman42