2012-01-28 21 views
5

मैं स्टैक ओवरफ़्लो के लिए एक नया हूं इसलिए कृपया मुझ पर आसान हो जाएं! मैं गहराई में सी # पढ़ रहा हूं लेकिन मैं एक परिदृश्य में आया हूं जो मुझे विश्वास नहीं है कि कवर किया गया है। वेब की एक त्वरित खोज ने किसी भी परिणाम को फेंक दिया नहीं।सामान्य तरीकों के प्रकार तर्कों के लिए टाइप करें

void AreEqual<T>(T expected, T actual) 

void AreEqual(object expected, object actual) 

अगर मैं एक प्रकार तर्क निर्दिष्ट किए बिना AreEqual() फोन:

AreEqual("Hello", "Hello") 

विधि का सामान्य या गैर जेनेरिक वर्जन शुरू हो जाती है

मैं निम्नलिखित अतिभारित पद्धतियां निर्धारित कहो? क्या जेनेरिक विधि अनुमानित तर्क तर्क के साथ आविष्कार किया गया है, या विधि तर्कों के साथ लागू गैर-सामान्य विधि System.Object पर निहित है?

मुझे आशा है कि मेरा प्रश्न स्पष्ट है। किसी भी सलाह के लिए अग्रिम धन्यवाद।

+5

आप इसे जांचने के लिए कुछ सरल कोड लिख सकते हैं ... –

+1

http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx –

+0

@ मिच गेहूं - सच है, लेकिन फिर मुझे अपनी पहली पोस्ट नहीं करनी पड़ेगी। और दूसरों के जवाब यहां देखने के लिए उपयोगी है। – zekesteer

उत्तर

5

जेनरिक एक फ़ंक्शन AreEqual(string, string) उत्पन्न कर सकता है। यह AreEqual(object, object) से अधिक निकट मिलान है, इसलिए सामान्य कार्य चुना जाता है।

दिलचस्प बात यह है कि संकलक इस सामान्य कार्य को चुनने के बावजूद भी बाध्यकारी उल्लंघन त्रुटि में परिणाम देगा। इस उदाहरण को

देखो:

using System.Diagnostics; 

namespace ConsoleSandbox 
{ 
    interface IBar 
    { 
    } 

    class Program 
    { 
     static void Foo<T>(T obj1) where T: IBar 
     { 
      Trace.WriteLine("Inside Foo<T>"); 
     } 


     static void Foo(object obj) 
     { 
      Trace.WriteLine("Inside Foo Object"); 
     } 

     static void Main(string[] args) 
     { 

      Foo("Hello"); 
     } 
    } 
} 

भी यहाँ यह गैर जेनेरिक वर्जन से अधिक जेनेरिक वर्जन का चयन करेंगे। और फिर आप यह त्रुटि प्राप्त:

The type 'string' cannot be used as type parameter 'T' in the generic type or method 'ConsoleSandbox.Program.Foo(T)'. There is no implicit reference conversion from 'string' to 'ConsoleSandbox.IBar'.

लेकिन यह कार्य करेगा जब आप एक समारोह Foo(string obj1) जोड़ें।

+0

महान जवाब, धन्यवाद! अच्छा उदाहरण, मैंने इसे पुष्टि करने के लिए खुद को कोशिश की :-) – zekesteer

+0

ध्यान दें कि अधिभार संकल्प सी # कंपाइलर द्वारा किया जाता है, न कि .NET ढांचे। – phoog

+0

@phoog - धन्यवाद, मैंने शब्द बदल दिया है –