c# - নিরপেক্ষ ধরনের এবং ত্রৈমাসিক অপারেটর: কেন? 10: নাল নিষিদ্ধ?




.net nullable (6)

এই প্রশ্নটি ইতিমধ্যে একটি উত্তর আছে:

আমি শুধু একটি অদ্ভুত ত্রুটি জুড়ে এসেছিলেন:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

তারপর, অন্য পদ্ধতিতে, এরকম কিছু:

int? x = GetBoolValue() ? 10 : null;

সহজ, যদি পদ্ধতিটি সত্য ফিরে আসে, Nullable int x এ 10 বরাদ্দ করুন। অন্যথায়, nullable int থেকে নিল বরাদ্দ। যাইহোক, কম্পাইলার অভিযোগ করেছে:

ত্রুটি 1 শর্তাধীন অভিব্যক্তি প্রকারটি নির্ধারণ করা যাবে না কারণ int এবং <null> মধ্যে কোনও অন্তর্নিহিত রূপান্তর নেই।

আমি বাদাম যাচ্ছে?


এটা চেষ্টা কর:

int? result = condition ? 10 : default(int?);


এটা চেষ্টা কর:

int? x = GetBoolValue() ? 10 : (int?)null;

মূলত যা ঘটছে তা হল শর্তসাপেক্ষ অপারেটরটি অভিব্যক্তিটির "প্রত্যাবর্তনের ধরন" নির্ধারণ করতে অক্ষম। যেহেতু কম্পাইলার ইচ্ছাকৃতভাবে সিদ্ধান্ত নেয় যে 10 টি একটি int পরে সিদ্ধান্ত নেয় যে এই অভিব্যক্তিটির রিটার্ন টাইপটি একটি int হিসাবেও হবে। যেহেতু একটি int null (শর্তাধীন অপারেটরের তৃতীয় অপারেড) এটি অভিযোগ করতে পারে।

একটি Nullable<int> ঢালাই করে আমরা কম্পাইলারটিকে স্পষ্টভাবে বলছি যে এই অভিব্যক্তিটির প্রত্যাবর্তন প্রকারটি একটি Nullable<int> । আপনি সহজেই 10 int? intest হিসাবে নিক্ষেপ করতে পারে int? পাশাপাশি একই প্রভাব ছিল।


কম্পাইলার প্রথমে ডান হাতের অভিব্যক্তি মূল্যায়ন করার চেষ্টা করে:

GetBoolValue() ? 10 : null

10 একটি int আক্ষরিক ( int? না int? ) এবং null হয়, ভাল, null । সেই দুজনের মধ্যে কোনও ত্রুটির বার্তা নেই তাই ত্রুটি বার্তা।

যদি আপনি নীচের ডান দিকের অভিব্যক্তিটি একটিতে পরিবর্তন করেন তবে এটি কম্পাইল হয় কারণ int? মধ্যে একটি অন্তর্নিহিত রূপান্তর আছে int? এবং null (# 1) এবং int এবং int? (# 2, # 3)।

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3

কারণ এটি কম্পাইলারটি দ্বিতীয় এবং তৃতীয় অপারেড্ডের দ্বারা শর্তাধীন অপারেটরটির ধরন নির্ধারণ করে, যা আপনি ফলাফলটি নির্দিষ্ট করে না। কম্পাইলারটি টাইপ নির্ধারণ করতে পারে এমন একটি পূর্ণসংখ্যা এবং একটি নিল রেফারেন্সের মধ্যে কোনও সরাসরি কাস্ট নেই।


শুধু একটি ব্যাখ্যা কাস্ট যোগ করুন।

int? x = GetBoolValue() ? 10 : (int?)null;

এটি ত্রৈমাসিক অপারেটর যা বিভ্রান্ত হয় - দ্বিতীয় যুক্তিটি একটি পূর্ণসংখ্যা এবং তাই তৃতীয় যুক্তিটি পূর্ণসংখ্যা হিসাবে প্রত্যাশিত, এবং নালও উপযুক্ত নয়।


সমস্যা হল যে টার্নারি অপারেটরটি আপনার প্রথম প্যারামিটার অ্যাসাইনমেন্টের উপর ভিত্তি করে টাইপ করছে ... 10 এই ক্ষেত্রে, যা একটি int, কোন nullable int নয়।

আপনি ভাল ভাগ্য থাকতে পারে:

int? x = GetBoolValue() (int?)10 : null;




conditional-operator