2010-08-09 14 views
7

ऐसा लगता है कि टर्नरी ऑपरेटर में कुछ प्रकार का भ्रम है। मुझे पता है कि यह अन्य एसओ धागे में संबोधित किया गया है, लेकिन यह हमेशा nullables के साथ किया गया है। इसके अलावा, मेरे मामले में मैं वास्तव में बस एक बेहतर तरीका की तलाश में हूं।डीबीएनयूएल का संक्षिप्त उपयोग? (टर्नरी?)

मैं

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id; 

उपयोग करने में सक्षम होना चाहते हैं, लेकिन इसके बजाय मैं इस के साथ अटक कर रहा हूँ:

if (string.IsNullOrEmpty(dest.Id)) 
{ 
    proc.Parameters[PARAM_ID].Value = DBNull.Value; 
} 
else 
{ 
    proc.Parameters[PARAM_ID].Value = dest.Id; 
} 

त्रिगुट ऑपरेटर विफल रहता है वहाँ DBNull और स्ट्रिंग के बीच कोई रूपांतरण संभव है क्योंकि, और मूर्खतापूर्ण के रूप में लगता है कि मूल्य वस्तु है, संकलक इसे वापस लाता है और मुझे परवाह करने के लिए मजबूर किया जाता है। इस प्रश्न के निरर्थक संस्करण का उत्तर केवल स्ट्रिंग को नल डालना है और इसके साथ किया जाना है; डीबीएनयूएल को स्ट्रिंग में नहीं डाला जा सकता है, हालांकि, वहां कोई भाग्य नहीं है।

वहाँ यह करने के लिए अधिक संक्षिप्त तरीका है (, nullables का उपयोग कर जिस तरह से बिना?)

धन्यवाद!

उत्तर

19

आप अपने पहले बयान के बदल सकता है:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id; 
+4

ओह। ओह। आण्ड यही है जो स्टैक ओवरफ्लो है। धन्यवाद! – bwerks

6

Value संपत्ति प्रकार object की है, तो आप object लिए डाली चाहिए, string नहीं:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id) 
    ? (object)DBNull.Value 
    : (object)dest.Id; 
+0

मैं के बाद से वह जाहिरा तौर पर के बारे में 20 सेकंड से पहले जवाब याकूब को जवाब देने के लिए जा रहा हूँ। आपको भी धन्यवाद! – bwerks

+0

@bwerks मुझे लगता है कि आप टाइमस्टैम्प को पीछे की ओर पढ़ते हैं। ;) – Dan

6

या आप एक विस्तार जोड़ सकता है विधि जैसे:

public static class DBNullExtensions 
{ 
    public static object AsDBNullIfEmpty(this string value) 
    { 
     if (String.IsNullOrEmpty(value)) 
     { 
      return DBNull.Value; 
     } 
     return value; 
    } 
} 

और फिर आप बस कह सकते हैं

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty(); 

(Phil Haack से अनुकूलित)

पठनीय और संक्षिप्त, नहीं?

+0

मैं विस्तार विधियों का उपयोग खोदता हूं; दुख की बात है कि यह परियोजना हालांकि सी # 2.0 पर है। बू उसका – bwerks

+3

बमर! शायद आप पत्थर के ओबिलिस्क से कुछ छेड़छाड़ कर सकते हैं;) –

3

उपयोग करने के बारे में क्या ?? अशक्त-वालों ऑपरेटर More details about ?? operator

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value; 
+0

ऑपरेटर '??' प्रकार 'बूल' और 'ऑब्जेक्ट' पर लागू नहीं किया जा सकता है। यदि आप '(ऑब्जेक्ट)' को हटाते हैं, तो संकलक 'ऑब्जेक्ट' के बजाय 'डीबीएनयूएल' प्रकार के बारे में शिकायत करेगा। – ivorykoder

+0

@ivorykoder ?? ऑपरेटर का उपयोग केवल शून्य प्रकारों पर किया जा सकता है, 'lhs ?? rhs' अनिवार्य रूप से 'lhs के बराबर है! = शून्य? एलएचएस: आरएसएस। यही कारण है कि आप "बूल" प्रकार पर लागू नहीं हो सकते हैं - 'बूल' शून्य नहीं है! – FireSBurnsmuP

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