यह दोनों का थोड़ा सा है। एक सामान्य वर्ग का उपयोग करने के लिए, आपको संकलन समय पर इसे एक प्रकार पैरामीटर देना होगा, लेकिन टाइप पैरामीटर इंटरफ़ेस या बेस क्लास का हो सकता है, इसलिए रनटाइम पर उपयोग की जाने वाली ऑब्जेक्ट्स का वास्तविक, ठोस प्रकार भिन्न हो सकता है।
उदाहरण के लिए, यहां मेरे पास Stack<T>
फ़ील्ड के साथ कोड का एक स्निपेट है। मैंने टाइप पैरामीटर के रूप में इंटरफ़ेस का उपयोग करना चुना है। यह संकलन समय पर parametric polymorphism का उपयोग करता है। आप का चयन करना होगा जो प्रकार पैरामीटर अपने _stack
क्षेत्र संकलन समय पर उपयोग करेगा:
public interface IFoo { void Foo(); }
public Stack<IFoo> _stack = new Stack<IFoo>();
अब, जब इस कोड स्निपेट को वास्तव में है चलाने के लिए, मैं किसी भी वस्तु जिसका वर्ग को लागू करता है IFoo
उपयोग कर सकते हैं, और कहा कि निर्णय नहीं है रन समय तक किए जाने के लिए:
public class Foo1 : IFoo { public void Foo() { Console.WriteLine("Foo1"); } }
public class Foo2 : IFoo { public void Foo() { Console.WriteLine("Foo2"); } }
public class Foo3 : IFoo { public void Foo() { Console.WriteLine("Foo2"); } }
_stack.Push(new Foo1());
_stack.Push(new Foo2());
_stack.Push(new Foo3());
यह subtype polymorphism, जो रन टाइम पर उपयोग किया जाता है का एक उदाहरण है।
आप इस लेख को देखना चाहते हैं: http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx – Guillaume
@ गुइलाउम ग्रेट, संक्षिप्त लेख मैं ईएल द्वारा कुछ खोज रहा था संदर्भ के रूप में। – FishBasketGordo