কেন এটি সংকলন করে না?
int? number = true ? 5 : null;
শর্তসাপেক্ষ প্রকাশের ধরণ নির্ধারণ করা যায় না কারণ 'int' এবং <null> এর মধ্যে কোনও অন্তর্নিহিত রূপান্তর নেই
কেন এটি সংকলন করে না?
int? number = true ? 5 : null;
শর্তসাপেক্ষ প্রকাশের ধরণ নির্ধারণ করা যায় না কারণ 'int' এবং <null> এর মধ্যে কোনও অন্তর্নিহিত রূপান্তর নেই
উত্তর:
বৈশিষ্ট (§7.14) বলছেন যে শর্তাধীন প্রকাশের জন্য b ? x : yতিনটি সম্ভাবনা পাওয়া যাবে, হয় xএবং yউভয় একটি প্রকার থাকা এবং নির্দিষ্ট ভাল অবস্থার , পূরণ করেছে মাত্র এক xএবং yএকটি টাইপ হয়েছে এবং নির্দিষ্ট ভাল অবস্থার একটি কম্পাইল-টাইম এরর পূরণ করা, অথবা দেখা দেয়। এখানে, "কিছু ভাল পরিস্থিতি" অর্থ কিছু নির্দিষ্ট রূপান্তর সম্ভব, যা আমরা নীচের বিশদগুলিতে যাব।
এখন, আসুন জার্মানির অংশটি ঘুরিয়ে নেওয়া:
যদি কেবল একটির
xএবংyএর একটি প্রকার থাকে, এবং উভয়ইxএবংyপ্রকৃতপক্ষে সেই ধরণের রূপান্তরিত হয় তবে শর্তসাপেক্ষ প্রকাশের ধরণ এটি।
বিষয়টি এখানে in
int? number = true ? 5 : null;
শর্তসাপেক্ষে কেবলমাত্র ফলাফলের একটি ধরণের রয়েছে। এখানে xএকটি হল intআক্ষরিক, এবং yহয় nullযা নেই না একটি টাইপ আছে এবং nullপরোক্ষভাবে একটি থেকে পরিবর্তনীয় নয় int1 । অতএব, "নির্দিষ্ট কিছু ভাল অবস্থা" পূরণ হয় না এবং একটি সংকলন-সময় ত্রুটি ঘটে।
সেখানে হয় এই সমস্যা এড়ানোর দুটি উপায়ে:
int? number = true ? (int?)5 : null;
এখানে আমরা যদি যেখানে মাত্র এক এখনও xএবং yএকটি টাইপ হয়েছে। নোট করুন যে null এখনও একটি টাইপ নেই তবুও সংকলকটির এতে কোনও সমস্যা হবে না (int?)5এবং nullএটি উভয়ই int?স্পষ্টত রূপান্তরিত (§6.1.4 এবং §6.1.5)।
অন্য উপায় স্পষ্টত:
int? number = true ? 5 : (int?)null;
তবে এটি কেন ঠিক আছে তা বুঝতে এখন আমাদের অনুমানের একটি ভিন্ন ধারা পড়তে হবে :
যদি
xটাইপ হয়েছেXএবংyটাইপ হয়েছেYতারপর
একটি অন্তর্নিহিত রূপান্তর (§6.1) থেকে উপস্থিত থাকলে
XকরতেY, কিন্তু না থেকেYথেকেX, তারপরYশর্তাধীন মত প্রকাশের প্রকার।একটি অন্তর্নিহিত রূপান্তর (§6.1) থেকে উপস্থিত থাকলে
YকরতেX, কিন্তু না থেকেXথেকেY, তারপরXশর্তাধীন মত প্রকাশের প্রকার।অন্যথায়, কোনও প্রকাশের ধরণ নির্ধারণ করা যায় না এবং একটি সংকলন-সময় ত্রুটি ঘটে।
এখানে xটাইপ intএবং yটাইপ হয় int?। সেখানে থেকে কোনো অন্তর্নিহিত রূপান্তর হয় int?থেকে int, কিন্তু থেকে একটি অন্তর্নিহিত রূপান্তর হয় intকরতে int?তাই মত প্রকাশের প্রকার int?।
1 : আরও নোট করুন যে শর্তসাপেক্ষ প্রকাশের ধরণটি নির্ধারণে বাম-হাতের প্রকারটি উপেক্ষা করা হয়, এখানে বিভ্রান্তির একটি সাধারণ উত্স।
new int?()জায়গায় (int?)null।
DateTime, তখন এটি প্রয়োজন হয়(DateTime?)
null কোনও শনাক্তকরণযোগ্য টাইপ নেই - এটি খুশি করার জন্য এটি কেবলমাত্র একটি সামান্য উত্থানের প্রয়োজন:
int? number = true ? 5 : (int?)null;
int? number = true ? 5 : null as int?;
int? number = true ? 5 : (int?)null;এবং int? number = true ? (int?)5 : null;উভয়ই সংকলন করুন !! স্ক্র্যাচ, স্ক্র্যাচ
অন্যরা যেমন বলেছে যে, 5 টি হ'ল intএবং nullতা স্পষ্টত রূপান্তরিত হতে পারে না int।
এখানে সমস্যাটি নিয়ে কাজ করার অন্যান্য উপায় রয়েছে:
int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();
int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;
int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;
int? num = true ? new int?(5) : null;
এছাড়াও, আপনি যে কোনও জায়গায় দেখতে পাবেন int?, আপনি এটি ব্যবহার করতেও পারেন Nullable<int>।
এটিতে C# 9এখন অনুমোদিত ব্লগ
টার্গেট টাইপ ?? এবং ?
মাঝে মাঝে শর্তসাপেক্ষ ?? এবং?: এক্সপ্রেশনগুলির শাখাগুলির মধ্যে সুস্পষ্ট ভাগ করা প্রকার নেই। এই জাতীয় কেসগুলি আজ ব্যর্থ হয়েছে, তবে সি # 9.0 উভয় শাখায় রূপান্তর করে এমন কোনও লক্ষ্য ধরণের থাকলে তাদের অনুমতি দেবে:
Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type
বা আপনার উদাহরণ:
// Allowed in C# 9.
int? number = true ? 5 : null;