2016-07-28 21 views
5

Tak więc mam ten kod, jeśli przerwę na instrukcji return, natychmiastowe okno wyświetla informacje poniżej.W jaki sposób obiekt może mieć wartość zerową i nie być równy zeru w tym samym czasie?

try 
{ 
    await connection.OpenAsync(); 
    var obj = await cmd.ExecuteScalarAsync(); 
    return obj != null ? Int32.Parse(obj.ToString()) != 1 : false; 
} 
catch (Exception ex) 
{ 
    Log.Error("An error has occurred checking a customer/product authorization.", ex); 
    return false; 
} 
finally 
{ 
    connection.Close(); 
} 

procedury przechowywanej jest tu odpowiednie części procedury. @HasAuthTable i @IsAuthorized należą do typu bit.

SELECT (CASE WHEN @HasAuthTable = 0 THEN 1 ELSE 0 END) | @IsAuthorized AS IsAuthorized 

Natychmiastowe Okno

obj 
0 

obj == null 
false 

obj != null 
false 

obj == 0 
error CS0019: Operator '==' cannot be applied to operands of type 'object' and 'int' 

obj != 0 
error CS0019: Operator '!=' cannot be applied to operands of type 'object' and 'int' 

(int)obj == 0 
true 

(int)obj != 0 
false 

obj.GetType().FullName 
"System.Int32" 

obj.Equals(null) 
false 

!obj.Equals(null) 
true 

Object.ReferenceEquals(obj, null) 
false 

!Object.ReferenceEquals(obj, null) 
false 

Próbowałem Przebudowa rozwiązanie niczego nie zmieni. Próbowałem też ponownie uruchomić Visual Studio. Brak szczęścia. Czy to zamierzone zachowanie? Wygląda jak błąd.

zmieniane procedury przechowywanej Próbowałem zmiany wyjścia z procedury przechowywanej, aby dopasować następujące czynności, aby sprawdzić, czy wpływa to w żaden sposób. Wynik jest w zasadzie taki sam. typ statyczny: object z oczekiwanym typem dynamicznym, oba mają wartości, ale wciąż zwracają false dla obj == null i obj != null.

SELECT CAST(((CASE WHEN @HasAuthTable = 0 THEN 1 ELSE 0 END) | @IsAuthorized) AS BIT) AS IsAuthorized 

odpowiednich Natychmiastowe Okno

obj 
false 

obj != null 
false 

obj == null 
false 

obj.GetType().FullName 
"System.Boolean" 
+0

Możliwy duplikat [Jak DBNull może nie być równy DBNull] (http://stackoverflow.com/questions/2060217/how-can-dbnull-not-equal-dbnull) – Eris

+0

@Eris Jeśli wartość to 'DBNull. Wartość ", a następnie" obj "nie zmieni się na" 0 ", a" obj! = Null "będzie" prawda ", a nie" fałsz ". – Servy

+0

Użyj debuggera, aby sprawdzić typ obiektu. – Ian

Odpowiedz

5

var obj = await cmd.ExecuteScalarAsync(); robi Boks.

enter image description here

Natychmiastowe Okno wyświetla błędną wartość, jeśli 0 jest pudełkową. To musi być błąd w natychmiastowym oknie.

enter image description here

Obraz jest od Illustrated C# 2012 4th Edition by Daniel Solis.

+0

Bezpośrednie okno odzwierciedla to, co dzieje się w kodzie. Więc kiedy osiągnie 'return obj! = Null? Int32.Parse (obj.ToString())! = 1: false; '' obj! = Null' zwraca wartość false (nawet te, które nie są zerowe). Zdaję sobie sprawę, że technicznie mogłem w tym momencie po prostu usunąć kontrolę "obj! = Null", ale byłem ciekawy, czy to jakieś nowe/dziwne zamierzone zachowanie czy błąd. – Shelby115

+2

Natychmiastowe okna mają błąd. Nie pasuje do wyniku, jeśli wartość boksu wynosi 0. Spójrz na zaktualizowany zrzut ekranu, który powraca. – Win

+0

Mam [zgłosił błąd natychmiastowego okna w repozytorium Roslyn] (https://github.com/dotnet/roslyn/issues/12846). – svick

Powiązane problemy