2013-05-09 19 views
5
bool? ispurchased = null; 
    var pospurcahsed= ispurchased ? "1":"2"; 

To wyjątek generowania.Błąd kompilatora dla Nullable Bool

Nie można w domyśle przekonwertować typu "bool?" do "bool". Istnieje wyraźna konwersja (czy brakuje Ci obsady?)

Co robię źle tutaj? dzięki za wsparcie i uwagę.

+0

To nie jest komunikat o błędzie pojawia, kopalnia mówi 'Nie można niejawnie przekonwertować typu" bool? do "bool". Istnieje wyraźna konwersja (czy brakuje Ci obsady?) 1' –

+0

@George Duckett Przepraszamy za błąd literowy. – Andrew

Odpowiedz

7

To nie jest dozwolone, ponieważ nie jest jasne, co oznacza zero w kontekście warunkowym.

Nullable Booleans mogą być oddane do bool wyraźnie, aby być wykorzystane w ramach warunkowego, ale jeśli obiekt ma wartość, jeśli null, InvalidOperationException zostanie wyrzucony.

Dlatego ważne jest sprawdzenie właściwości HasValue przed przesłaniem do bool.

wykorzystanie takich jak

var pospurcahsed= (ispurchased.HasValue && ispurchased.Value) ?...... 

dopuszczające wartość null Boolean są podobne do typu Boolean zmiennej używanej w SQL. Aby zapewnić, że wyniki wyprodukowane przez & i | Operatorzy są zgodne z SQL trzech wartościach typu Boolean, następujące predefiniowane operatorzy są:

bool? operator &(bool? x, bool? y) 

bool? operator |(bool? x, bool? y) 

enter image description here

lub użyć martin sugestię GetValueOrDefault [Dzięki Martin do wskazując go]

Metoda GetValueOrDefault zwraca wartość, nawet jeśli właściwość HasValue ma wartość false (w przeciwieństwie do właściwości Value, która zgłasza wyjątek).

+1

'ispurchased.HasValue && ispurchased.Value' może być przeredagowany jako' ispurchased == true', który IMO jest bardziej czytelny. – hvd

+1

Lub jako 'ispurchased.GetValueOrDefault()' –

+0

@Martin i edytowałem moją odpowiedź. – joshua

2

Problem polega na tym, że operator warunkowy ? : spodziewa się, że nie będzie to bool, a nie . Możesz po prostu go rzucić i zrobić, ale dostaniesz InvalidOperationException, jeśli wartość zawiera null, więc powinieneś najpierw sprawdzić to.

względu na nazwę zmiennej, Poszedłem do przodu i przyjąć, że chcesz traktować null tak jak false, więc w kodzie poniżej mogę sprawdzić, że ma wartość, a jeśli tak, to użyje go w tym stanie. W przypadku nie mają wartości (czyli to null wtedy obsada nigdy nie nastąpi i nie pojawia się błąd (wyrażenie będzie oceniać na false).

bool? ispurchased = null; 
var pospurcahsed = (ispurchased.HasValue && (bool)ispurchased) ? "1":"2"; 
2

Nie można używać Nullable<bool> lub bool? w stanie bezpośrednio, zamiast używać go jak:

var pospurcahsed= (ispurchased.HasValue && ispurchased.Value) ? "1":"2"; 
2

należy użyć .wartość

bool? ispurchased = null; 

if (ispurchased.HasValue) 
{ 
    var pospurcahsed = ispurchased.Value ? "1" : "2"; 
} 
0

można użyć coś jak ten

bool? chk = false; 

//or 

bool? chk2 = false; 

var test = (chk != null && (bool)chk) ? "1": "2"; 

//or 

var test2 = (chk2.HasValue && (bool)chk2) ? "1" : "2"; 

proponuję nie używać var kluczowe dla znanych typów.

Zamiast tego zastosowania takiego:

String test = (chk != null && (bool)chk) ? "1" : "2";