2010-10-28 18 views
19

La compilation du code suivant renvoie l'erreur The call is ambiguous between the following methods or properties. Comment le résoudre puisque je ne peux pas explicitement convertir null à l'une de ces classes?Comment résoudre l'ambiguïté lorsque l'argument est nul?

static void Main(string[] args) 
{ 
    Func(null); 
} 

void Func(Class1 a) 
{ 

} 

void Func(Class2 b) 
{ 

} 
+1

oh, désolé, on dirait que je peux :) – Poma

Répondre

24
Func((Class1)null); 
10

Cast null du type:

Func((Class1)null); 
3

Vous devriez être en mesure de jeter nulle à l'un de ces, même comme vous le feriez une Func((Class1)null) variable.

8

Vous pouvez également utiliser une variable:

Class1 x = null; 
Func(x); 
+2

+1 Cette méthode est plus facile à lire et à comprendre que (null (Class1)) fonct. Casting null n'est pas intuitif. – wllmsaccnt

+0

Cette méthode est préférable à l'incantation dans la mesure du possible, car elle rencontre de nombreux problèmes au moment de la compilation qui, autrement, seraient des erreurs d'exécution. – hypehuman

4

Les méthodes Func() acceptent un type de référence en tant que paramètre, qui peut être nulle. Puisque vous appelez la méthode avec une valeur explicite null, le compilateur ne sait pas si votre null est supposé être en référence à un objet Class1 ou à un objet Class2.

Vous avez deux options:

Cast le null soit le type Class1 ou Class2, comme dans Func((Class1)null) ou Func((Class2)null)

Fournir une nouvelle surcharge de la méthode Func() qui accepte aucun paramètre, et appeler que la surcharge lorsque vous ne disposez pas d'une référence d'objet explicite:

void Func() 
{ 
    // call this when no object is available 
} 
5

en utilisant as pour la coulée rend READA un peu plus ble avec la même fonctionnalité.

Func(null as Class1);