2010-10-28 18 views
19

Skompilowanie następującego kodu zwróci błąd The call is ambiguous between the following methods or properties. Jak rozwiązać problem, ponieważ nie mogę jednoznacznie przekonwertować null na żadną z tych klas?Jak rozwiązać niejednoznaczność, gdy argument ma wartość zerową?

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

void Func(Class1 a) 
{ 

} 

void Func(Class2 b) 
{ 

} 
+1

oh, przepraszam, wygląda jak mogę :) – Poma

Odpowiedz

24
Func((Class1)null); 
10

Obsada null do typu:

Func((Class1)null); 
3

Powinieneś móc oddawać zerowy do jednej z nich, tak samo jak byś zmiennej Func((Class1)null).

8

Można również użyć zmiennej:

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

+1 Ta metoda jest łatwiejsza do odczytania i zrozumienia niż func ((Class1) null). Odrzucanie wartości null nie jest intuicyjne. – wllmsaccnt

+0

Jest to lepsze rozwiązanie niż rzutowanie, gdy tylko jest to możliwe, ponieważ powoduje wiele problemów podczas kompilacji, które w innym przypadku byłyby błędami rzutowania w czasie wykonywania. – hypehuman

4

W Func() metody zaakceptować typ referencyjny jako parametr, który może być null. Ponieważ wywołujesz metodę z wyraźną wartością null, kompilator nie wie, czy Twój null ma być odniesieniem do obiektu Class1 czy obiektu Class2.

Masz dwie opcje:

oddanych zerowy albo typu Class1 lub Class2, jak w Func((Class1)null) lub Func((Class2)null)

Podaj nową przeciążenie metody Func() że przyjmuje żadnych parametrów, i nazywają to przeciążenie gdy nie ma wyraźnego odniesienia obiektu:

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

Korzystanie as do odlewania sprawia, że ​​nieco więcej reada z tą samą funkcjonalnością.

Func(null as Class1); 
Powiązane problemy