শর্তসাপেক্ষ প্রকাশের ধরণ নির্ধারণ করা যায় না কারণ 'int' এবং <null> এর মধ্যে কোনও অন্তর্নিহিত রূপান্তর নেই


165

কেন এটি সংকলন করে না?

int? number = true ? 5 : null;

শর্তসাপেক্ষ প্রকাশের ধরণ নির্ধারণ করা যায় না কারণ 'int' এবং <null> এর মধ্যে কোনও অন্তর্নিহিত রূপান্তর নেই


উত্তর:


337

বৈশিষ্ট (§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 : আরও নোট করুন যে শর্তসাপেক্ষ প্রকাশের ধরণটি নির্ধারণে বাম-হাতের প্রকারটি উপেক্ষা করা হয়, এখানে বিভ্রান্তির একটি সাধারণ উত্স।


4
কেন এমন হয় তা বোঝাতে বিশ্লেষণের ভাল উদ্ধৃতি - +1!
জেরকিম্বল

7
আরেকটি বিকল্পের new int?()জায়গায় (int?)null
গুভান্তে

1
আপনার ক্ষেত্রে যদি অবিচ্ছেদ্য ডেটাবেস ক্ষেত্রের প্রকার থাকে যেমন উদাহরণস্বরূপ একটি অযোগ্য ডেটটাইম এবং আপনি চেষ্টা করেন এবং ডেটা প্রয়োজন হয় DateTime, তখন এটি প্রয়োজন হয়(DateTime?)
মাইক উপজোঁ

73

null কোনও শনাক্তকরণযোগ্য টাইপ নেই - এটি খুশি করার জন্য এটি কেবলমাত্র একটি সামান্য উত্থানের প্রয়োজন:

int? number = true ? 5 : (int?)null;

2
বা আপনি করতে পারেনint? number = true ? 5 : null as int?;
ব্র্যাড এম

দারুণ উত্তর উত্তর। সুন্দর সম্পর্কিত পঠন: ericlippert.com/2013/05/30/ কি- স্মরণ- এফ- আইস
বেনিয়ামিন

ইস্যু না যে nullএকটি শনাক্তযোগ্য টাইপ নেই। সমস্যা থেকে কোন অন্তর্নিহিত রূপান্তর আছে যে nullকরতে int। বিশদ এখানে
জেসন

মজার বিষয় হ'ল এটি int? number = true ? 5 : (int?)null;এবং int? number = true ? (int?)5 : null;উভয়ই সংকলন করুন !! স্ক্র্যাচ, স্ক্র্যাচ
ডেভিডক

2
আমার উত্তরে কেন এমন হয় আমি ঠিক তা cover াকাই
জেসন

4

অন্যরা যেমন বলেছে যে, 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>


1

এটিতে 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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.