2008-09-16 18 views
47
EmployeeNumber = 
string.IsNullOrEmpty(employeeNumberTextBox.Text) 
    ? null 
    : Convert.ToInt32(employeeNumberTextBox.Text), 

sık sık kendimi böyle şeyler yapmak isteyen bulmak (o bir özellik olduğu gibi EmployeeNumber bir Nullable<int> bir LINQ SQL sütun NULL değerleri verir nereye itiraz dbml). Ne yazık ki, derleyici, her iki türün bir ataçman işleminde kendi başına null edilebilen bir int için geçerli olsa bile, "null" ve "int" arasında herhangi bir örtük dönüşüm yoktur.NULLL <value> türleriyle koşullu operatör ataması?

Sıfır birleştirici işleç, null değilse .Text dizesinde gerçekleşmesi gereken satır içi dönüştürme nedeniyle görebildiğim kadar bir seçenek değil.

Bunu yapmanın tek yolunun, bir if ifadesi kullanmak ve/veya iki adımda atamak olduğunu bildiğim kadarıyla. Bu özel durumda, çok sinir bozucu olduğunu buldum çünkü nesne başlatıcı sözdizimini kullanmak istedim ve bu atama, başlatma bloğunda olurdu ...

Daha şık bir çözüm bilen var mı?

+1

Eric Lippert ile ilgili blog girişini kontrol edin: [Inference woes, part one yazın] (http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-inference-woes-part -one.aspx) – CodesInChaos

+0

[Derleyici Hatası ** CS0173 **] (http://msdn.microsoft.com/en-us/library/vstudio/hb47kt2f%28v=vs.120%29.aspx) beni buraya getirdi. – DavidRR

cevap

60

koşullu operatör değeri ifade türünü belirlemek için (bu durumda atanmış) nasıl kullanıldığına bakmak olmadığı için bu sorun oluşur - - sadece doğru/yanlış değerler. Bu durumda, bir boş ve ınt32 var ve tipi (sadece Nullable Int32 > < kabul edemeyiz gerçek nedenleri vardır) tespit edilemeyen.

Eğer gerçekten bu şekilde kullanmak istiyorsanız, türünü çözebilirsiniz null <Int32> kendiniz, yani C# için değerlerden birini döküm gerekir:

EmployeeNumber = 
    string.IsNullOrEmpty(employeeNumberTextBox.Text) 
    ? (int?)null 
    : Convert.ToInt32(employeeNumberTextBox.Text), 

veya

EmployeeNumber = 
    string.IsNullOrEmpty(employeeNumberTextBox.Text) 
    ? null 
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text), 
+4

Ayrıca 'new int?()' Yazabilirsiniz. – SLaks

+6

Nullable 'u kabul edememesinin gerçek nedenleri olduğunu söylüyorsunuz. Hangi sebepler? – BlueMonkMN

+1

@SLaks Veya 'varsayılan (int?)'. – IllidanS4

3

dönüştürmek çıktısını çevirebilirsiniz:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) 
    ? null 
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text) 
8

Bir yardımcı programın bu temizleyicinin yapılmasına yardımcı olabileceğini düşünüyorum. Alex soruya doğru ve proksimal cevabı sağlarken

public static class Convert 
{ 
    public static T? To<T>(string value, Converter<string, T> converter) where T: struct 
    { 
     return string.IsNullOrEmpty(value) ? null : (T?)converter(value); 
    } 
} 

sonra

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse); 
+0

Bu gerçekten iyi bir fikir ve genel ve uzantı yöntemlerinin son derece harika olduğu bir örnek :) – Grank

6

, ben kullanmayı tercih TryParse:

int value; 
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value) 
    ? (int?)value 
    : null; 

daha güvenli olduğunu ve geçersiz girdi vakalarının ilgilenir boş dize senaryosunun yanı sıra. Aksi takdirde, kullanıcı 1b gibi bir şey girdiyse, Convert.ToInt32(string) neden işlenmeyen özel durum ile bir hata sayfası ile sunulacak.

+0

Kullanıcının girişini, bir DataTypeCheck Operator ve int türüne ayarlanabilen ASP.NET CompareValidator kullanarak doğrulamayı tercih ederim . Bu, girişin hiçbir zaman bir tamsayıdan başka bir şey olmamasını sağlar ve eğer yapabilirse istemci tarafı yapar. – Grank

1
//Some operation to populate Posid.I am not interested in zero or null 
int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response; 
var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null; 

DÜZENLEME: öte, Posid değerini almaya çalışırken (int onun null olmayan ve eğer 0'dan büyük değere sahip) varibale X1 içinde edilmiştir kısa açıklaması. Koşul operatörünün herhangi bir derleme hatası atmaması için (int?)'u Posid.Value numaralı telefondan kullanmam gerekiyordu. Sadece bir FYI GetHolidayCount, null veya herhangi bir sayı verebilir bir WCF yöntemidir. Bu yardımcı olur umarım

+0

Genel olarak, kodunuzun yalnızca kodu göndermek yerine ne yaptığını gösteren bir açıklama eklemeniz önerilir. Bu, soruyu soran kişinin (ve aynı sorunu yaşarken bu soruyu bulan kişileri) çözümünüzün ne yaptığını anlamasına yardımcı olur. –

+0

Bunu işaret ettiği için teşekkürler Robert. – Sandeep