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"
Możliwy duplikat [Jak DBNull może nie być równy DBNull] (http://stackoverflow.com/questions/2060217/how-can-dbnull-not-equal-dbnull) – Eris
@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
Użyj debuggera, aby sprawdzić typ obiektu. – Ian