2016-11-11 57 views
5

Mam następujący wiersz kodu:Dlaczego można użyć operatora warunkowego o wartości zerowej podczas ustawiania wartości parametru bool bez użycia parametru zerującego?

user.Exists = await this.repository?.Exists(id); 

Exists na lewej stronie jest własnością klasy User. Jego typ to tylko bool, a nie bool?. Metoda Exists po prawej stronie jest metodą interfejsu API służącą do sprawdzania, czy dany obiekt istnieje w repozytorium. Zwraca Task<bool>. Chcę sprawdzić, czy repozytorium ma wartość zerową, więc używam operatora warunkowego null. Pomyślałem, że jeśli repozytorium ma wartość NULL, wówczas cała prawa strona po prostu zwróci wartość null, której nie można przypisać do typu bool, ale kompilator wydaje się być z nią w porządku. Czy po prostu domyślnie jest to wartość fałszywa?

+0

Próbowałeś uruchomić ten kod? Jeśli nie, spróbuj, a zobaczysz. Albo wyobraź sobie, co by się stało, gdyby metoda Exists zwróciła null zamiast Task – Evk

+0

. Cóż, 'await' może zrzucić sprawdzanie typu, ale czego oczekiwałbyś wyniku, gdyby' repozytorium 'miało wartość null? –

Odpowiedz

7

Problemem jest Oczekujcie. Pustych dzieje się przed czekają, więc to jak await (this.repository?.Exists(id)), które po this.repository jest null, zamienia się await (null?.Exists(id)), który zamienia się await (null), który wywala. The?. nie jest w stanie dotrzeć do Task<bool> i uczynić go Task<bool?>.

więc będzie albo uzyskać właściwą wartość logiczną lub wyjątek.

+0

To ma sens, dzięki za wyjaśnienie tego. Lepiej to wtedy zmienię. – Drew

+0

@ChadNedzlek - Za twoją odpowiedź na moje pytanie, myślę, że to dobra odpowiedź i dała mi informację, której szukałem. Myślę, że jeśli opublikujesz pewną sekcję tego artykułu, odpowiedź będzie dobra, a ja przegłosuję i zaakceptuję. Doceniam twoją odpowiedź :) –