यह TypeA
और TypeB
पर निर्भर करता है।
- तो वास्तव में उनमें से एक पर लागू होता है तो कॉल लागू एक करने के लिए किया जाएगा (जैसे वहाँ
TypeB
को null
से कोई रूपांतरण है क्योंकि यह एक मान प्रकार है, लेकिन TypeA
एक संदर्भ प्रकार है)।
- अन्यथा यह
TypeA
और TypeB
के बीच संबंधों पर निर्भर करता है।
- अगर वहाँ
TypeA
से TypeB
को एक अंतर्निहित रूपांतरण लेकिन TypeB
TypeA
करने से कोई अंतर्निहित रूपांतरण तो TypeA
का उपयोग कर अधिभार का उपयोग किया जाएगा।
- अगर वहाँ
TypeB
से TypeA
को एक अंतर्निहित रूपांतरण लेकिन TypeA
TypeB
करने से कोई अंतर्निहित रूपांतरण तो TypeB
का उपयोग कर अधिभार का उपयोग किया जाएगा।
- अन्यथा, कॉल संदिग्ध है और संकलित करने में विफल हो जाएगा।
देखें अनुभाग विस्तृत नियम के लिए सी # 3.0 कल्पना की 7.4.3.4।
यहां इसका एक उदाहरण अस्पष्ट नहीं है। यहां TypeB
TypeA
से निकला है, जिसका अर्थ है कि TypeB
से TypeA
तक एक अंतर्निहित रूपांतरण है, लेकिन इसके विपरीत नहीं। इस प्रकार TypeB
का उपयोग कर अधिभार प्रयोग किया जाता है:
using System;
class TypeA {}
class TypeB : TypeA {}
class Program
{
static void Foo(TypeA x)
{
Console.WriteLine("Foo(TypeA)");
}
static void Foo(TypeB x)
{
Console.WriteLine("Foo(TypeB)");
}
static void Main()
{
Foo(null); // Prints Foo(TypeB)
}
}
सामान्य में, यहां तक कि एक अन्यथा-अस्पष्ट कॉल का सामना करने में, यह सुनिश्चित करें कि एक विशेष अधिभार प्रयोग किया जाता है, बस डाली:
Foo((TypeA) null);
या
Foo((TypeB) null);
ध्यान दें कि यदि इसमें घोषित कक्षाओं में विरासत शामिल है (यानी एक वर्ग अपनी बेस क्लास द्वारा घोषित विधि को अधिभारित कर रहा है) तो आप एक पूरी समस्या में हैं, और आप ne तर्क के बजाए विधि के लक्ष्य को कास्ट करने के लिए एड।
स्रोत
2009-04-05 19:51:09
एक और एक कॉल कर सकते हैं की ओवरलोड हो गया है तरीकों जहां कम से कम एक विधि पैरामीटर कीवर्ड का उपयोग करता है के बारे में पता किया जाना है। –