2016-07-28 12 views
5

तो मेरे पास यह कोड है, अगर मैं return कथन पर बिंदु तोड़ता हूं तो तत्काल विंडो नीचे दी गई जानकारी को आउटपुट करती है।एक ऑब्जेक्ट एक ही समय में शून्य और शून्य कैसे हो सकता है?

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(); 
} 

संग्रहित प्रक्रिया यहाँ संग्रहीत प्रक्रिया के प्रासंगिक भागों है। @HasAuthTable और @Is Authorized bit प्रकार के हैं।

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

तत्काल खिड़की

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 

मैं कोशिश की है समाधान के पुनर्निर्माण के लिए कुछ भी नहीं बदला। मैंने विजुअल स्टूडियो को पुनरारंभ करने का भी प्रयास किया है। कोई भाग्य नहीं। क्या यह इरादा व्यवहार है? यह एक बग की तरह लगता है।

प्रक्रिया संग्रहित बदल मैं इसे किसी भी तरह से यह प्रभावित करता है, तो देखने के लिए निम्नलिखित मैच के लिए संग्रहीत प्रक्रिया के उत्पादन को बदलने की कोशिश की। नतीजा मूल रूप से वही है। अपेक्षित गतिशील प्रकार के साथ object का स्थिर प्रकार, दोनों मान हैं लेकिन obj == null और obj != null के लिए अभी भी लौट रहे हैं।

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

संबंधित तत्काल खिड़की

obj 
false 

obj != null 
false 

obj == null 
false 

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

की संभावित डुप्लिकेट [बराबर नहीं DBNull DBNull कैसे] (http://stackoverflow.com/questions/2060217/how-can-dbnull-not-equal-dbnull) – Eris

+0

@Eris यदि मान 'DBNull था। मूल्य' फिर 'obj'' 0' और 'obj! = Null' को हल नहीं करेगा 'सत्य'' false' नहीं होगा। – Servy

+0

ओबीजे के प्रकार का निरीक्षण करने के लिए डीबगर का उपयोग करें। – Ian

उत्तर

5

var obj = await cmd.ExecuteScalarAsync();मुक्केबाजी कर रही है।

enter image description here

तत्काल खिड़की गलत मान अगर 0 बॉक्सिंग प्रदर्शित करता है। यह तत्काल विंडो में एक बग होना चाहिए।

enter image description here

चित्र Illustrated C# 2012 4th Edition by Daniel Solis से है।

+0

तत्काल विंडो कोड में क्या होता है दर्शाता है। तो जब यह 'वापसी obj! = शून्य तक पहुँचता है? Int32.Parse (obj.ToString())! = 1: झूठी; 'obj! = Null' झूठी वापसी करता है (यहां तक ​​कि वे शून्य नहीं हैं)। मुझे पता है कि मैं तकनीकी रूप से इस बिंदु पर 'obj! = Null' चेक को हटा सकता हूं लेकिन अगर मैं कुछ नया/अजीब जानबूझकर व्यवहार या एक बग था तो मैं उत्सुक था। – Shelby115

+2

तत्काल खिड़कियों में एक बग है। यदि मुक्केबाजी मूल्य 0 है तो यह परिणाम से मेल नहीं खाता है। अपडेट किए गए स्क्रीनशॉट को वापस देखें। – Win

+0

मैंने [Roslyn repo पर तत्काल विंडो बग की सूचना दी है] (https://github.com/dotnet/roslyn/issues/12846)। – svick

संबंधित मुद्दे