2009-10-29 5 views
6

Eventuali duplicati:
C#: Passing null to overloaded method - which method is called?domanda CLR. Perché l'overloading di metodo in C# decide che null è una stringa?

Ecco un banco di prova

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) 

La domanda è perché CLR decide che nulla viene interpretata come stringa nel primo caso? Sembra che questa domanda abbia già risposto here

Ecco un altro caso simile. Nessuno di questi IFS vengono attivate

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

Possibile duplicato: http://stackoverflow.com/questions/719546/c-passing-null-to-overloaded-method-which-method-is-called – CMS

+0

Suppongo che aspettiamo fino a quando Jon Skeet si sveglia e ci illumina su questo –

+0

Ha già, sul link che CMS ha pubblicato. –

risposta

2

La risposta è perché deve scegliere un tipo di riferimento (null non funziona per tipi di valori), e ogni string è un object, ma non ogni object è un string. See Jon Skeet's answer to this question for more information.

In risposta al secondo esempio, se una variabile che è null viene passata a is, verrà sempre valutata su false, non importa quale.

0

Nel risoluzione di sovraccarico, di fronte a una scelta di risolvere un parametro a una classe di base o di una classe derivata, il compilatore sceglierà sempre la classe più derivata se si adatta. Ciò consente sovraccarichi che considerano una classe derivata non ambigua con sovraccarichi che prendono la classe base. In questo caso, poiché la stringa è dervied dall'oggetto, viene preferita la stringa.

Per i dettagli, vedere Sezione 7.4.3 nel numero C# Language Specification. C'è una discussione molto complessa lì, ma l'idea di base è che non c'è un algoritmo che il compilatore utilizza per definire il "migliore" sovraccarico, e una delle cose che rende uno meglio dell'altro è questo:

• per almeno un argomento, la conversione da da EX a PX è migliore di rispetto alla conversione da EX a QX.

lettura on:

• Se una conversione implicita da T1 a T2 esiste, e nessuna conversione implicita da T2 a T1 esiste, C1 è il migliore conversione .

Poiché c'è una conversione implicita da qualsiasi classe derivata alla sua base, ma non viceversa, le regole sopra significa che qualsiasi sovraccarico corrispondenza dervied classe batte sempre un parametro classe base in un sovraccarico.

+0

Qualche riferimento alla fonte? –

Problemi correlati