2012-02-01 25 views
23

Próbuję przekonwertować wartość zerowej bool i otrzymuję ten błąd.Nie można niejawnie przekonwertować typu bool?

Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?) 

Na przykład:

public virtual bool? MyBool 
    { 
    get; 
    set; 
    } 

if (!MyBool){} 
+2

Krótko mówiąc, zerowalne boole są mylące. (spójrz na SQL) – SLaks

+0

Nie sądzę, że to jest zbyt mylące, to tylko Ternary Logic: http://en.wikipedia.org/wiki/Three-valued_logic - Bardzo mi się podoba, bo podoba mi się pojęcie czegoś nie ma żadnej wartości. Innymi słowy, niezainicjowany kontra zainicjowany. – dyslexicanaboko

Odpowiedz

30

Jak stwierdza błędach, nie można użyć bool? w warunkowa. (Co by się stało, gdyby to null?)

Zamiast tego można napisać if (MyBool != true) lub if (MyBool == false), w zależności od tego, czy chcesz dołączyć null. (I należy dodać komentarz wyjaśniający, że)

+5

Kolejnym ważnym sprawdzianem jest 'MyBool ?? false', chociaż generalnie preferuję 'MyBool.GetValueOrDefault()'. –

+0

@AnthonyPegram: Jednak wymaga to dodatkowych nawiasów dla negacji, a także jest bardziej mylące. – SLaks

+0

Nie zgadzam się z pierwszym, ale nie uważam, aby drugi był trudniejszy do użycia lub zrozumienia. Ogólnie rzecz biorąc, nie lubię bezpośrednich porównań do prawdziwych lub fałszywych, chociaż robię to dokładnie w zapytaniach Linq-EF, ponieważ ta metoda nie jest obsługiwana. –

9

Musisz użyć MyBool.Value

na przykład:

Jednakże, należy sprawdzić, czy to rzeczywiście ma wartość na początek . Testuje, że MyBool ma wartość i jest ona fałszywa.

if (MyBool.HasValue && !MyBool.Value) { } 

Lub naprawdę może chcesz następujące, które uruchamiają blok kodu, jeśli nie został przypisany lub ma wartość false.

if (!MyBool.HasValue || !MyBool.Value) { } 

Pytanie naprawdę sprowadza się do tego, czy rzeczywiście ma mieć zerowalne zmienną logiczną, a jeśli tak, w jaki sposób chcesz obsłużyć 3 możliwe warunki null, true or false.

2

Musisz sprawdzić, czy ma wartość. Co chcesz zrobić, jeśli MyBool == null?

if(MyBool.HasValue && !MyBool.Value) // MyBool is false 
if(MyBool.HasValue && MyBool.Value) // MyBool is true 
if(!MyBool.HasValue) // MyBool is null 
Powiązane problemy