Nullable বস্তুর একটি মান থাকতে হবে


189

ব্যতিক্রম বর্ণনায় প্যারাডক্স রয়েছে: নুলাবল বস্তুর অবশ্যই একটি মান (?!) থাকতে হবে

এটাই সমস্যা:

আমার একটা DateTimeExtendedক্লাস আছে, আছে

{
  DateTime? MyDataTime;
  int? otherdata;

}

এবং একটি নির্মাতা

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

এই কোড চলছে

DateTimeExtended res = new DateTimeExtended(oldDTE);

InvalidOperationExceptionবার্তা দিয়ে একটি ছুড়ে :

Nullable বস্তুর একটি মান থাকতে হবে।

myNewDT.MyDateTime.Value- বৈধ এবং একটি নিয়মিত DateTimeঅবজেক্ট থাকে।

এই বার্তার অর্থ কী এবং আমি কী ভুল করছি?

নোট যে oldDTEনা null। আমি Valueএখান থেকে সরিয়েছি myNewDT.MyDateTimeতবে উত্পন্ন সেটার কারণে একই ব্যতিক্রম ছোঁড়া হয়েছে।


অন্য নির্মাতা কি?
পল ক্রেসি

স্ট্রেঞ্জ। আমি ব্যতিক্রমটি পুনরায় উত্পাদিত করে। সেখানে মূল্য দিন এবং সেখানে ব্যতীত কোনও মূল্য পান না V মূল্য সেখানে। আপনি কি নিশ্চিত যে আপনি আপডেট কোডটি চালাচ্ছেন?
ইউলি

কনস্ট্রাক্টর নিজেই একটি উদাহরণ নেয়। আপনি কিভাবে প্রথম নজির তৈরি করছেন?
পল ক্রেসি

এটি প্যারামিটার ছাড়াই নতুন () হিসাবে নির্মিত হয় এবং তারপরে আমি মানগুলি যুক্ত করি (এটি কাজ করে)।
দানি

6
সমস্যা সমাধান হয়েছে - সমস্যাটি ছিল না ... অন্য ডেটা এবং মাইডেটটাইমগুলিতে একটি উত্পাদিত সেটার ছিল, এটি সেট করার আগে মানটি যাচাই করছিল .. উড়তে থাকলে এটি উড়ে গেছে !!!
দানি

উত্তর:


201

আপনার লাইনটি this.MyDateTime = myNewDT.MyDateTime.Value;কেবলমাত্রে পরিবর্তন করা উচিতthis.MyDateTime = myNewDT.MyDateTime;

আপনি যে ব্যতিক্রমটি পেয়েছিলেন তা নুলাবলির.Value সম্পত্তিতে ফেলে দেওয়া হয়েছিল , কারণ এটি কোনও (যেহেতু রাজ্যগুলির জন্য চুক্তিটি হ'ল) ফেরত দেওয়া দরকার , তবে এটি আর করতে পারে না কারণ ফেরার কোনও ব্যবস্থা নেই , তাই এটি ব্যতিক্রম ছুঁড়ে ফেলে। DateTimeDateTime.ValueDateTime

সাধারণত, একটি খারাপ ধারণা অন্ধ ডাকতে .Value, একটি nullable ধরনের উপর, যদি না আপনি কিছু পূর্বে জ্ঞান যে পরিবর্তনশীল আছে হবে (ক মাধ্যমে অর্থাত একটি মান ধারণ করে .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নাল অবজেক্টে কল করা ব্যতিক্রম পাওয়া অর্থপূর্ণ হয়ে উঠবে (আমার ধারণা), তবে ব্যতিক্রম বার্তাটি যদি সত্যিই বিভ্রান্তিকর হয় তবে আপনি যদি দুটি নলযোগ্য বস্তুর সাথে ডিল করছেন। '।। মূল্য সম্পত্তিটি অবজেক্টটিকে নন-নাল হওয়া প্রয়োজন' এর মতো কিছুটা পুরোপুরি আরও অর্থবহ করে তুলবে।
ডিভিকে

9

লিনকিউ এক্সটেনশন পদ্ধতিগুলি ব্যবহার করার সময় (যেমন Select, Where) ল্যাম্বডা ফাংশনটি এসকিউএলে রূপান্তরিত হতে পারে যা আপনার সি # কোডের সাথে অভিন্ন আচরণ করতে পারে না। উদাহরণস্বরূপ, সি # এর শর্ট সার্কিট মূল্যায়ন করা হয়েছে &&এবং ||এসকিউএল এর উত্সাহী 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

এই ক্ষেত্রে ওল্ডডিটিই নাল, সুতরাং আপনি যখন ওল্ডডিটিইতে অ্যাক্সেস করার চেষ্টা করবেন তখন মূল্য নেই বলে অবৈধ অপসারণের ধারণাটি নিক্ষেপ করা হয়। আপনার উদাহরণে আপনি সহজভাবে এটি করতে পারেন:

this.MyDateTime = newDT.MyDateTime;

ওল্ডডিটিই নাল নয়, তবে আমি যে কোনওভাবে মান সরিয়ে নিয়েছি ... এটি এখনও সেই ব্যতিক্রম ছুঁড়ে দিচ্ছে ....
দানি


0

পুরানো ডিডিটিইয়ের মতো মনে হচ্ছে M মাইডেটটাইমটি শূন্য ছিল, তাই নির্মাতারা এর মানটি নেওয়ার চেষ্টা করেছিল - যা ছুঁড়েছিল।


0

নাল মূল্যবান বস্তুর মান অ্যাক্সেস করার চেষ্টা করার সময় আমি এই বার্তাটি পেয়েছি।

sName = myObj.Name;

এটি ত্রুটি উত্পন্ন করবে। প্রথমে আপনার পরীক্ষা করা উচিত অবজেক্টটি নাল নয় কিনা

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

এইটা কাজ করে.


1
উত্তর দেওয়ার আগে, প্রথম প্রশ্নের জন্য অন্যান্য উত্তর মাধ্যমে পড়তে চেষ্টা করুন - বিশেষ করে গৃহীত উত্তর যে রাজ্যের ঠিক কি আপনি মধ্যে স্থাপন করা আপনার উত্তর। যদিও এটি কোড ব্যবহার করে এটি দেখায় না, এটি বানান করে। এছাড়াও, প্রশ্নের উদাহরণের সাথে আপনার উদাহরণ কোডটি প্রাসঙ্গিক করার চেষ্টা করুন - যেমন this.MyDateTime = myNewDT.MyDateTime.Value;নয়sName = myObj.Name;
ফার্নিচার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.