रद्द पदार्थ का मूल्य ज़रूर होना चाहिए


189

अपवाद विवरण में विरोधाभास है: अशक्त वस्तु का मूल्य होना चाहिए (!)

यही समस्या है:

मेरे पास एक DateTimeExtendedक्लास है, जो है

{
  DateTime? MyDataTime;
  int? otherdata;

}

और एक निर्माता

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime.Value;
   this.otherdata = myNewDT.otherdata;
}

इस कोड को चला रहा है

DateTimeExtended res = new DateTimeExtended(oldDTE);

InvalidOperationExceptionसंदेश के साथ फेंकता है :

रद्द पदार्थ का मूल्य ज़रूर होना चाहिए।

myNewDT.MyDateTime.Value- मान्य है और इसमें एक नियमित DateTimeऑब्जेक्ट है।

इस संदेश का क्या अर्थ है और मैं क्या गलत कर रहा हूं?

ध्यान दें कि oldDTEनहीं है null। मैंने से हटा दिया है Value, myNewDT.MyDateTimeलेकिन एक उत्पन्न सेटर के कारण एक ही अपवाद फेंक दिया गया है।


अन्य कंस्ट्रक्टर क्या है?
पॉल क्रीज

अजीब। मैं .Value के साथ अपवाद को पुन: प्रस्तुत करता हूं, और वहाँ .Value के बिना कोई अपवाद नहीं मिलता है। क्या आप वाकई अपडेटेड कोड चला रहे हैं?
यूलिया

कंस्ट्रक्टर खुद का एक उदाहरण लेता है। आप उस पहली घटना को कैसे बना रहे हैं?
पॉल क्रीज

यह बिना मापदंडों के नए () के रूप में निर्मित है, और फिर मैं मान जोड़ता हूं (यह काम करता है)।
दानी

6
समस्या हल हो गई - समस्या नहीं थी ... अन्यडेटा और MyDateTime के लिए एक उत्पन्न सेटर था, जो इसे सेट करने से पहले मान की जाँच कर रहा था .. जब यह शून्य है तो उड़ान !!!
दानी

जवाबों:


201

आपको लाइन this.MyDateTime = myNewDT.MyDateTime.Value;को बस में बदलना चाहिएthis.MyDateTime = myNewDT.MyDateTime;

आप जो अपवाद प्राप्त कर रहे थे .Valueवह अशक्त की संपत्ति में फेंक दिया गया था DateTime, क्योंकि इसे वापस करने की आवश्यकता है DateTime(क्योंकि .Valueराज्यों के लिए अनुबंध क्या है), लेकिन ऐसा नहीं कर सकते क्योंकि वहाँ कोई नहीं हैDateTime वापसी है, इसलिए यह एक अपवाद फेंकता है।

सामान्य तौर पर, यह .Valueएक अशक्त प्रकार से आँख बंद करके कॉल करने के लिए एक बुरा विचार है , जब तक कि आपके पास कुछ पूर्व ज्ञान नहीं है कि चर MUST में एक मान होता है (यानी एक .HasValueचेक के माध्यम से )।

संपादित करें

यहाँ उस कोड के लिए DateTimeExtendedअपवाद नहीं है:

class DateTimeExtended
{
    public DateTime? MyDateTime;
    public int? otherdata;

    public DateTimeExtended() { }

    public DateTimeExtended(DateTimeExtended other)
    {
        this.MyDateTime = other.MyDateTime;
        this.otherdata = other.otherdata;
    }
}

मैंने इसे इस तरह से परखा:

DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);

अपवाद जोड़ने .Valueपर other.MyDateTimeअपवाद बनता है। इसे हटाने से अपवाद से छुटकारा मिल जाता है। मुझे लगता है कि आप गलत जगह देख रहे हैं।


आप .value के बारे में सही हैं, फिर भी कुछ और अपवाद का कारण बनता है। मैंने .value को हटा दिया है, और मैंने कंस्ट्रक्टर के कोड ऑर्डर को बदल दिया है - पहले इंट वैल्यू की नकल करते हुए, लेकिन उसी अपवाद को फेंक दिया गया है।
दानी

मैंने प्रश्न पर टिप्पणी की है - समस्या को पाया, यह गुणों के लिए एक उत्पन्न सेटर में था।
दानी

हां, इसकी समस्या का समाधान मेरी समस्या है, मैं बस अशक्त सक्षम वस्तु को गैर अशक्त सक्षम में बदल देता हूं, और डेटाटाइम को सीधे स्ट्रिंग में परिवर्तित कर सकता हूं, न कि datetimeobject.value.datetime.tostring () द्वारा
adnan

बहुत बढ़िया जवाब। .Valueएक अशक्त वस्तु पर एक अपवाद कॉल करना समझ में आता है (मुझे लगता है), लेकिन अपवाद संदेश वास्तव में भ्रामक है यदि आप दो अशक्त वस्तुओं के साथ व्यवहार करते हैं। Al The .Value प्रॉपर्टी के लिए वस्तु को गैर-अशक्त होने की आवश्यकता होती है ’जैसा कुछ होना चाहिए।
DVK

9

LINQ एक्सटेंशन मेथड्स (उदाहरण Selectके लिए Where) का उपयोग करते समय , लैम्ब्डा फ़ंक्शन को SQL में परिवर्तित किया जा सकता है जो संभवतः आपके # # कोड के लिए व्यवहारिक रूप से व्यवहार नहीं करता है। उदाहरण के लिए, C # के शॉर्ट-सर्किट का मूल्यांकन किया जाता है &&और ||इसे SQL के उत्सुक ANDऔर में परिवर्तित किया जाता है OR। जब आप अपने लैम्ब्डा में नल की जाँच कर रहे हैं तो यह समस्या पैदा कर सकता है।

उदाहरण:

MyEnum? type = null;
Entities.Table.Where(a => type == null || 
    a.type == (int)type).ToArray();  // Exception: Nullable object must have a value

5
मुझे लगता है कि यह जवाब ओपी के विशिष्ट मामले के लिए प्रासंगिक नहीं है, लेकिन यह उस अपवाद के लिए प्रासंगिक है जो उसे मिल रहा है। इसके अलावा, यह पृष्ठ उस अपवाद के लिए Google पर पहली हिट है, जो इसे प्रासंगिक बनाता है।
रक्षक एक

6

छोड़ने की कोशिश करो .value

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime;
   this.otherdata = myNewDT.otherdata;
}

मदद नहीं करता है। यदि मैं पहली पंक्ति को चलाता हूं तो यह उसी अपवाद को फेंकता है।
दानी

2

इस मामले में oldDTE शून्य है, इसलिए जब आप oldDTE तक पहुँचने का प्रयास करते हैं। तो अमान्य मान को छोड़ दें क्योंकि कोई मान नहीं है। अपने उदाहरण में आप बस यह कर सकते हैं:

this.MyDateTime = newDT.MyDateTime;

OldDTE अशक्त नहीं है, लेकिन मैंने किसी भी तरह मान को हटा दिया ... यह अभी भी उस अपवाद को फेंक रहा है ....
दानी



0

मुझे यह संदेश तब मिला जब मैं एक अशक्त मूल्यवान वस्तु के मूल्यों तक पहुंचने की कोशिश कर रहा था।

sName = myObj.Name;

यह त्रुटि उत्पन्न करेगा। पहले आपको जांचना चाहिए कि क्या वस्तु अशक्त नहीं है

if(myObj != null)
  sName = myObj.Name;

यह काम।


1
उत्तर देने से पहले, कृपया पहले प्रश्न के अन्य उत्तरों के माध्यम से पढ़ने का प्रयास करें - विशेष रूप से स्वीकृत उत्तर जो बताता है कि आपने अपने उत्तर में क्या रखा है । हालांकि यह कोड का उपयोग करके इसे नहीं दिखाता है, लेकिन यह इसे मंत्र देता है। इसके अलावा, अपने उदाहरण कोड को प्रश्न के लिए प्रासंगिक बनाने का प्रयास करें - जैसे कि this.MyDateTime = myNewDT.MyDateTime.Value;, नहींsName = myObj.Name;
newfendoy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.