কেন এটি সংকলন করে না?
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
পরোক্ষভাবে একটি থেকে পরিবর্তনীয় নয় int
1 । অতএব, "নির্দিষ্ট কিছু ভাল অবস্থা" পূরণ হয় না এবং একটি সংকলন-সময় ত্রুটি ঘটে।
সেখানে হয় এই সমস্যা এড়ানোর দুটি উপায়ে:
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;