2010-08-09 21 views
7

Üçlü operatörde biraz karışıklık var gibi görünüyor. Bunun diğer SO iş parçacıklarında ele alındığını biliyorum, ancak her zaman nullable olmuştur. Ayrıca, benim durumum için gerçekten sadece daha iyi bir yol arıyorum.DBNull'in muhterileri? (Üçlü?)

Ben

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

kullanabilmek için istiyorum ama bunun yerine bu takıldım: DBNull ve dize arasındaki olası hiçbir dönüşüm olmadığından

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

üçlü operatör başarısız, Ve Değer'in nesne olduğunu düşünürken aptalca olduğu gibi, derleyici onu bana geri gönderiyor ve ben de umursamıyorum. Bu sorunun null imi versiyonunun cevabı sadece null dizgiye çevirmek ve onunla yapılmak; DBNull dizeye gönderilemez, ancak şansınız yok.

Bunu yapmak için daha kısa bir yolu var mı (bu arada, nullables kullanmadan?)

teşekkürler!

cevap

19

Size ilk açıklama için değişebilir:

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

Oh. Duh. Aave, stackoverflow'un ne için olduğu. Teşekkürler! – bwerks

6

Value özellik türü object arasında, yani, değil stringobject için kullanması gereklidir:

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

Onun görünüşte yaklaşık 20 saniye ile birinci cevap beri Jacob cevabını vereceğim. Teşekkürler, teşekkürler! – bwerks

+0

@bwerks Zaman damgalarını geriye doğru okuduğunuzu düşünüyorum. ;) – Dan

6

Yoksa bir uzantı ekleyebilirsiniz yöntem, örneğin,

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

Sonra da

Okunabilir ve özlü (Phil Haack den uyarlanmıştır)

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

söyleyebiliriz, değil mi?

+0

Uzantı yöntemlerini kullanıyorum; Ne yazık ki bu proje C# 2.0 üzerinde. Vay canına. – bwerks

+3

Bummer! Belki de taş dikilitaşlarından bir şey kesebilirsiniz;) –

3

Nasıl kullanılır? boş-kaynaştırma operatör More details about ?? operator

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

Operatör '??' 'bool' ve 'object' türlerine uygulanamaz. '(object)' öğesini kaldırırsanız, derleyici 'object' yerine 'DBNull' türünden şikayet eder. – ivorykoder

+0

@ivorykoder the ?? Operatör sadece nullable tiplerde kullanılabilir, lhs ?? rhs' esas olarak lhs! = null'a eşdeğerdir? lhs: rhs'. bool' null değil '- Eğer "türü 'bool' tatbik edilemez" alıyorsanız nedeni budur! – FireSBurnsmuP