Właśnie natknąłem się na dziwny błąd:Rodzaje null i operator trójskładnikowy: dlaczego `? 10: zabronione?
private bool GetBoolValue()
{
//Do some logic and return true or false
}
Następnie w innej metody, coś takiego:
int? x = GetBoolValue() ? 10 : null;
proste, jeśli metoda zwraca true, przypisywanie 10 do Nullable int
x. W przeciwnym razie przypisz wartość null do nullable int. Jednak kompilator uskarża się na:
Error 1 Type of conditional expression cannot be determined because there is no implicit conversion between
int
and<null>
.
Czy zwariowałem?
Być może zostanie to poprawione w przyszłej wersji kompilatora, bo tam naprawdę jest niejawna konwersja między „int” i „” i to 'int? –
@bruno, Jak to się różni od powiedzenia "naprawdę jest niejawna konwersja pomiędzy [dowolnego typu] i [dowolnego innego typu] i tym" obiektem "? Czy myślisz, że "poprawią" to również w przyszłej wersji kompilatora? Na przykład: object x = GetBoolValue()? (object) "foo": (object) DateTime.Now; – LukeH
Wyobraź sobie, że kompilator był wystarczająco inteligentny, aby powiedzieć "OK, nie używamy pierwszego typu (int), więc szukamy innego typu, którego możemy użyć dla wyniku tego wyrażenia". Co byś otrzymał, gdybyś wpisał "Console.WriteLine ((Predicate()? 5.6: null) .GetType(). ToString());"? Czy otrzymasz pływak? lub podwójne? lub obiekt? Lub klasa zdefiniowana przez użytkownika z niejawną konwersją z float? W jaki sposób kompilator będzie wiedział, który typ wybrać, ponieważ nie może wybrać tego w wyrażeniu? – mquander