c# - নির্বোধ টাইপ সমস্যা সঙ্গে ?: শর্তাধীন অপারেটর




generics nullable (4)

কেউ ব্যাখ্যা করতে পারে কেন এটি সি # নেট নেট 2.0 এ কাজ করে:

    Nullable<DateTime> foo;
    if (true)
        foo = null;
    else
        foo = new DateTime(0);

... কিন্তু এটা না করে:

    Nullable<DateTime> foo;
    foo = true ? null : new DateTime(0);

পরের ফর্মটি আমাকে একটি কম্পাইল ত্রুটি দেয় "শর্তাধীন অভিব্যক্তিটির ধরন নির্ধারণ করা যায় না কারণ '<null>' এবং 'System.DateTime' এর মধ্যে কোনও অন্তর্নিহিত রূপান্তর নেই।"

আমি পূর্বের ব্যবহার করতে পারি না, তবে দ্বিতীয় শৈলীটি আমার বাকি কোডের সাথে আরও সামঞ্জস্যপূর্ণ।


FYI (অফপোস্টিক, কিন্তু নিফটি এবং অসমর্থিত প্রকারের সাথে সম্পর্কিত) আমাদের একটি সহজ অপারেটর রয়েছে যা কেবল নল কোলেসেসিং অপারেটর বলে

??

এইভাবে ব্যবহৃত:

// Left hand is the nullable type, righthand is default if the type is null.
Nullable<DateTime> foo;
DateTime value = foo ?? new DateTime(0);

আমি জানি এই প্রশ্নটি ২008 সালে বলা হয়েছিল এবং এখন 5 বছর পরে কিন্তু উত্তরের উত্তরটি আমাকে সন্তুষ্ট করে না। আসল উত্তর হল DateTime একটি কাঠামো, এবং একটি গঠন হিসাবে এটি নল সঙ্গে সামঞ্জস্যপূর্ণ নয়। আপনার সমাধান করার দুটি উপায় রয়েছে:

প্রথমটি তারিখের সময়ের সাথে অসামঞ্জস্যপূর্ণ করতে হবে (উদাহরণস্বরূপ, তারিখের সময় নিক্ষেপ করা হবে? 70 টি আপভোটের সাথে সজ্জন সুপারিশ করে, অথবা অবজেক্টে বা মান টাইপে নিক্ষেপ করুন)।

দ্বিতীয়টি তারিখের সময়কে নল দিয়ে সামঞ্জস্যপূর্ণ করা (উদাহরণস্বরূপ, তারিখ তারিখের তারিখ তারিখ থেকে?)।


এটি একটি ত্রৈমাসিক অপারেটর, কারণ দুটি মান একই ধরনের সমাধান করা আবশ্যক।


গ্রহণযোগ্য অনুরূপ আরেকটি সমাধান হল C # এর default কীওয়ার্ড ব্যবহার করা। জেনেরিক্স ব্যবহার করে সংজ্ঞায়িত করা হলেও, এটি আসলে কোনও প্রকারের জন্য প্রযোজ্য।

উদাহরণ ব্যবহার OP এর প্রশ্নে প্রয়োগ করা হয়েছে:

Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);

বর্তমান গ্রহণযোগ্য উত্তর সহ উদাহরণ ব্যবহার:

DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);

এছাড়াও, default ব্যবহার করে, আপনি এটি একটি nullable মান নির্ধারণ করার জন্য পরিবর্তনশীল হিসাবে nullable হিসাবে উল্লেখ করতে হবে না। কম্পাইলার নির্দিষ্ট পরিবর্তনশীল-টাইপ এর ডিফল্ট মান স্বয়ংক্রিয়ভাবে বরাদ্দ করা হবে এবং কোন ত্রুটি সম্মুখীন হবে। উদাহরণ:

DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);




conditional-operator