2009-10-29 14 views
6

Powiel możliwe:
C#: Passing null to overloaded method - which method is called?Pytanie CLR. Dlaczego metoda przeciążania w C# decyduje, że null jest ciągiem znaków?

Oto przypadek testowy

object a = null; 
var b = Convert.ToString (null); 
var c = Convert.ToString (a); 
string d = Convert.ToString (null); // CLR chooses Convert.ToString(string value) 
string e = Convert.ToString (a); // CLR chooses Convert.ToString(object value) 

Powstaje pytanie, dlaczego CLR zdecyduje, że zerowa jest interpretowany jako ciąg w pierwszym przypadku? Wygląda na to, że na to pytanie już udzielono odpowiedzi here

Oto kolejny podobny przypadek. Żaden z tych funduszy inwestycyjnych są wyzwalane

object x = null; 
if (x is object) 
{ 
    Console.Write ("x is object"); 
} 

if (x is string) 
{ 
    Console.Write ("x is string"); 
} 

if (null is object) 
{ 
    Console.Write ("null is object"); 
} 

if (null is string) 
{ 
    Console.Write ("null is string"); 
} 
+3

Powiel możliwe: http://stackoverflow.com/questions/719546/c-passing-null-to-overloaded-method-which-method-is-called – CMS

+0

Przypuszczam, czekamy aż Jon Skeet budzi się i oświeca nas na tej. –

+0

On już ma, na łączu opublikowanym przez CMS. –

Odpowiedz

2

Odpowiedź jest, ponieważ musi wybrać rodzaj odniesienia (null nie działa dla typów wartości), a każdy string jest object, ale nie każdy object jest string. See Jon Skeet's answer to this question for more information.

W odpowiedzi na drugi przykład, jeśli zmienna, która ma wartość null, zostanie przekazana do is, zawsze będzie fikcją, bez względu na wszystko.

0

W rozdzielczości przeciążenia, gdy w obliczu wyboru rozwiązywania parametr do klasy podstawowej lub klasy pochodnej, kompilator zawsze wybrać klasę najbardziej pochodzącą czy pasuje. Umożliwia to przeciążenia, które powodują, że klasa pochodna nie jest niejednoznaczna z przeciążeniami, które przyjmują klasę podstawową. W tym przypadku, ponieważ łańcuch jest pochodną od obiektu, preferowany jest ciąg.

Aby uzyskać szczegółowe informacje, patrz punkt 7.4.3 w C# Language Specification. Jest tam bardzo złożona dyskusja, ale podstawową ideą jest to, że istnieje algorytm, który kompilator używa do zdefiniowania "najlepszego" przeciążenia, a jedną z rzeczy, która czyni go lepszym niż druga, jest:

• dla co najmniej jednego argumentu, konwersja z EX na PX jest lepsza niż konwersja z EX na QX.

Czytanie na:

• Jeśli niejawna konwersja od T1 do T2 istnieje i nie niejawna konwersja od T2 do T1 istnieje, C1 jest lepiej konwersji.

Ponieważ istnieje niejawna konwersja z dowolnego klasy pochodnej do jej podstawy, ale nie odwrotnie, przepisy powyższe oznacza, że ​​każdy przeciążenie dopasowanie dervied klasy zawsze bije się parametr base-klasy w przeciążenia.

+0

Wszelkie odniesienia do źródła? –

Powiązane problemy