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

मैं अक्सर अपने आप को इस तरह काम करने के लिए इच्छुक लगता है (EmployeeNumber एक Nullable<int> है के रूप में उस पर एक संपत्ति है एक LINQ करने वाली एसक्यूएल dbml आपत्ति जहां स्तंभ शून्य मान की अनुमति देता है)। दुर्भाग्यवश, कंपाइलर का मानना ​​है कि "नल 'और' int '' के बीच कोई अंतर्निहित रूपांतरण नहीं है, भले ही दोनों प्रकार एक असाइनमेंट ऑपरेशन में मान्य हो जाएं, जो कि खुद के लिए एक निरर्थक int है।Nullable <value> प्रकारों के साथ सशर्त ऑपरेटर असाइनमेंट?

नल कोलेसिंग ऑपरेटर एक विकल्प नहीं है जहां तक ​​मैं इनलाइन रूपांतरण की आवश्यकता के कारण देख सकता हूं। टेक्स्ट स्ट्रिंग अगर यह शून्य नहीं है।

जहां तक ​​मुझे पता है कि ऐसा करने का एकमात्र तरीका एक कथन का उपयोग करना है और/या इसे दो चरणों में असाइन करना है। इस विशेष मामले में मुझे यह बहुत निराशाजनक लगता है क्योंकि मैं ऑब्जेक्ट प्रारंभकर्ता सिंटैक्स का उपयोग करना चाहता था और यह असाइनमेंट प्रारंभिक ब्लॉक में होगा ...

कोई भी एक और अधिक सुरुचिपूर्ण समाधान जानता है?

+1

एरिक लिपर्ट की संबंधित ब्लॉग प्रविष्टि की जांच करें: [टाइप अनुमान वज़न, भाग एक] (http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-inference-woes-part -one.aspx) – CodesInChaos

+0

[कंपाइलर त्रुटि ** सीएस 0173 **] (http://msdn.microsoft.com/en-us/library/vstudio/hb47kt2f%28v=vs.120%29.aspx) मुझे यहां लाया। – DavidRR

उत्तर

60

समस्या होती है क्योंकि सशर्त ऑपरेटर कैसे मूल्य प्रयोग किया जाता है (इस मामले में सौंपा) अभिव्यक्ति के प्रकार का निर्धारण करने के लिए पर गौर नहीं करता - - बस सच/झूठे मूल्य। इस मामले में, आप एक अशक्त और एक Int32 है, और प्रकार निर्धारित नहीं किया जा सकता है (वहाँ असली कारणों यह सिर्फ कल्पना नहीं कर सकते Nullable <Int32> हैं)।

तुम सच में इस तरह से इसका उपयोग करना चाहते हैं, तो आप के लिए Nullable <Int32> खुद है, तो सी # में से एक मान डाली प्रकार हल कर सकते हैं चाहिए:

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

या

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

आप 'नया int?() 'भी लिख सकते हैं। – SLaks

+6

आप कहते हैं कि वास्तविक कारण हैं जो इसे Nullable नहीं मान सकते हैं। क्या कारण हैं? – BlueMonkMN

+1

@SLaks या 'डिफ़ॉल्ट (int?)'। – IllidanS4

3

कन्वर्ट के उत्पादन में डाली कर सकते हैं:

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

मुझे लगता है कि एक उपयोगिता विधि इस क्लीनर को बनाने में मदद कर सकती है।

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

तो

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

यह वास्तव में एक अच्छा विचार है, और जहां जेनेरिक और एक्सटेंशन विधियां बेहद भयानक हैं इसका एक उदाहरण :) – Grank

6

एलेक्स अपने प्रश्न के सही और समीपस्थ उत्तर प्रदान करते हैं, मैं का उपयोग करना पसंद TryParse:

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

यह सुरक्षित है और अमान्य इनपुट के मामलों का ख्याल रखता है साथ ही साथ आपकी खाली स्ट्रिंग परिदृश्य। अन्यथा यदि उपयोगकर्ता 1b जैसे कुछ इनपुट करता है तो उन्हें Convert.ToInt32(string) में किए गए अनचाहे अपवाद के साथ एक त्रुटि पृष्ठ प्रस्तुत किया जाएगा।

+0

मैं एएसपी.NET तुलना वैलिडेटर का उपयोग करके उपयोगकर्ता के इनपुट को सत्यापित करना पसंद करता हूं, जिसे डेटाटाइप चेक के ऑपरेटर पर सेट किया जा सकता है और int का प्रकार । यह सुनिश्चित करता है कि इनपुट कभी भी पूर्णांक के अलावा कुछ भी नहीं होगा, और यदि यह कर सकता है तो यह क्लाइंट-साइड करता है। – 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; 

संपादित करें: ऊपर, मैं Posid के मूल्य को प्राप्त करने की कोशिश की गई थी (अपने nonnull अगर int और 0 से अधिक मूल्य वाले) varibale X1 में की संक्षिप्त विवरण। सशर्त ऑपरेटर को किसी भी संकलन त्रुटि को फेंकने के लिए मुझे (int?)Posid.Value पर उपयोग करना पड़ा। बस एक एफवाईआई GetHolidayCount एक WCF विधि है जो null या किसी भी संख्या दे सकती है। आशा है कि

+0

आमतौर पर यह अनुशंसा की जाती है कि आप केवल कोड पोस्ट करने के बजाय आपका कोड क्या करते हैं इसका विवरण शामिल करें। यह व्यक्ति से सवाल पूछने में मदद करता है (और जिन लोगों को एक ही समस्या का सामना करते हुए यह प्रश्न मिला है) समझें कि आपका समाधान क्या कर रहा है। –

+0

रॉबर्ट को इंगित करने के लिए धन्यवाद। – Sandeep

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