বর্ধমান নাল <<> কেন ব্যতিক্রম ছুঁড়ে না?


99

আপনি দয়া করে ব্যাখ্যা করতে পারেন, কেন Console.WriteLine(null)কনসোল. রাইটলাইন খালি লাইন লিখছেন ( আমাকে সংকলন ত্রুটি দিন) এবং কেন নুলরফারেন্সএক্সেপশন নেই (এমনকি a+=1এটি উত্থাপন করা উচিত নয়) কেন?

int? a = null;
a++; // Why there is not NullReferenceException? 
Console.WriteLine(a); // Empty line

সমস্ত তিনটি অপারেটরের ++, +=এবং +রূপগুলো প্রত্যাহার করেছে। সুতরাং বিবৃতি a++;, a += 1;এবং a = a + 1;সমস্ত অনুমোদিত। প্রতিটি উত্পাদক null(কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়নি) যদি aপ্রাথমিকভাবে হয় null
জেপ্পে স্টিগ নীলসন

4
NullReferenceException? কিন্তু int?একটি নয় Referenceএটা শুধু একটি আছে, intযে গ্রহণ করতে পারেন nullমান
Khaled.K

উত্তর:


124

আপনি একটি উত্তোলনকারী অপারেটরের প্রভাব পর্যবেক্ষণ করছেন ।

সি # 5 নির্দিষ্টকরণের 7.3.7 বিভাগ থেকে:

লিফটেড অপারেটরগুলি পূর্বনির্ধারিত এবং ব্যবহারকারী-সংজ্ঞায়িত অপারেটরগুলি অনুমতি দেয় যা অ-নলাশয়যোগ্য মান ধরণের উপর পরিচালনা করে those এই জাতীয় প্রকারের নিকটযোগ্য ফর্মগুলির সাথেও ব্যবহৃত হয়। লিফটেড অপারেটরগুলি পূর্বনির্ধারিত এবং ব্যবহারকারী-সংজ্ঞায়িত অপারেটরগুলি থেকে তৈরি করা হয় যা নীচে বর্ণিত হিসাবে নির্দিষ্ট প্রয়োজনীয়তাগুলি পূরণ করে:

  • অ্যানারি অপারেটরগুলির জন্য অপারেটরের + ++ - -- ! ~ একটি উত্তোলিত ফর্ম উপস্থিত থাকে যদি অপারেন্ড এবং ফলাফলের ধরণগুলি উভয় অ-মূল্যহীন মান ধরণের হয়। উত্তোলিত ফর্মটি ?অপারেন্ড এবং ফলাফলের ধরণগুলিতে একটি একক সংশোধক যুক্ত করে নির্মিত হয়। অপারেন্ডটি শূন্য হলে উত্তোলনকারী অপারেটর একটি নাল মান উত্পাদন করে। অন্যথায়, উত্তোলনকারী অপারেটর অপারেন্ডটি মোড়ক করে, অন্তর্নিহিত অপারেটরটি প্রয়োগ করে এবং ফলাফলটি আবৃত করে।

সুতরাং মূলত, a++এই ক্ষেত্রে একটি ফলাফল nullহিসাবে একটি এক্সপ্রেশন হয় (হিসাবে হিসাবেint? এক্ষেত্রে ) এবং ভেরিয়েবলটি অদৃশ্য থাকে।

আপনি যখন ফোন করবেন

Console.WriteLine(a);

objectএটিকে বক্স করা হচ্ছে , যা এটিকে একটি নাল রেফারেন্সে রূপান্তর করে, যা খালি লাইন হিসাবে মুদ্রিত।


4
"নাল" ব্যবহার না করে মুদ্রণের কোনও উপায় আছে কি Console.WriteLine(a == null ? "null" : a)?
কোল জনসন

4
@ কোল জনসন: কনসোল. রাইটলাইন (একটি ?? "নাল"); :)
ডেভিড চ্যাপেল

4
@DavidChappelle যখন aধরনের হয় int?, আমি বলব a ?? "null"খুঁজে বের করে দুই operands জন্য কোন সাধারণ ধরন। আপনার একটি ইঙ্গিত দরকার objectযা সাধারণ ধরণ। সুতরাং হয় অপ্রেনড নিক্ষেপ। aBoxed করা হবে না। উদাহরণস্বরূপ ((object)a) ?? "null"বা a ?? (object)"null"
জেপ্প স্টিগ নীলসেন

সুপার. আপনি কি অনুমান লিঙ্ক করতে পারেন? আমরা যখন আমাদের নিজস্ব ক্লাসে অপারেটরগুলি ওভারলোড করি তখন কী আমরা এটিকে সংজ্ঞায়িত করতে পারি?
ফিল

@teabaggs: আমি এখনই সহজে লিঙ্ক করতে পারি না, এবং লিঙ্কটি কেবল একটি ওয়ার্ড ডকের হবে (যা আপনি কোনও অনুসন্ধানের সাথে সহজেই যথেষ্ট খুঁজে পেতে পারেন)। আপনি যথাযথ যেখানে অপারেটর ওভারলোডগুলি সংজ্ঞায়িত করেন আপনি স্বয়ংক্রিয়ভাবে উত্তোলিত অপারেটরগুলি পাবেন।
জন স্কিটি

116

জনের উত্তর সঠিক তবে আমি কিছু অতিরিক্ত নোট যুক্ত করব।

Console.WriteLine(null)সংকলন ত্রুটি কেন দেয় ?

এখানে 19 টি ওভারলোড রয়েছে Console.WriteLineএবং এর মধ্যে তিনটি nullএকটিতে প্রযোজ্য : যেটি একটি নেয়, একটি stringনেয় char[]এবং একটি যা নেয় object। সি # আপনার এই তিনটির মধ্যে কোনটির অর্থ তা নির্ধারণ করতে পারে না, সুতরাং এটি একটি ত্রুটি দেয়। Console.WriteLine((object)null)আইনী হবে কারণ এখন এটি স্পষ্ট।

কেন Console.WriteLine(a)একটি খালি লাইন লিখুন?

aএকটি নাল int?। ওভারলোড রেজোলিউশন objectপদ্ধতির সংস্করণ চয়ন করে , তাই এটি int?নাল রেফারেন্সে বাক্সযুক্ত। সুতরাং এটি মূলত একই Console.WriteLine((object)null), যা একটি খালি লাইন লিখেছে।

কেন বাড়াতে হয় না NullReferenceException?

আপনি যে নাল রেফারেন্স নিয়ে উদ্বিগ্ন তা কোথায় ? aএকটি নাল int?যা দিয়ে শুরু করার কোনও রেফারেন্স টাইপ নয়! মনে রাখবেন, নলযোগ্য মান ধরণের মান প্রকার , রেফারেন্স প্রকার নয় , সুতরাং রেফারেন্স টাইপটিতে বক্স না করা থাকলে তাদের কাছে রেফারেন্স শব্দার্থিকতা থাকার আশা করবেন না। সংযোজনে কোনও বক্সিং নেই।


0

তুমি কি নাল বাড়িয়ে দিচ্ছ ???

int? a = null;
a++;

এই বিবৃতিটির সহজ অর্থ হ'ল null++নাল +1।

এই দস্তাবেজ অনুসারে, একটি নলযোগ্য প্রকারটি তার অন্তর্নিহিত মান প্রকারের জন্য মানগুলির সঠিক পরিসীমা উপস্থাপন করতে পারে, এবং অতিরিক্ত নাল মানটিও উপস্থাপন করতে পারে A নাল মান নির্ধারণ করা যেতে পারে

এখানে আপনি নাল বৃদ্ধি করছেন, তারপরে এটি 0 বা অন্য কোনও পূর্ণসংখ্যারও নাল মান হয়ে যাবে।

এটি ত্রুটির পরিবর্তে ফাঁকা মুদ্রণ কেন ??

আপনি যখন নাল মান সহ একটি nlalable প্রিন্ট মুদ্রণ এটি ত্রুটির পরিবর্তে ফাঁকা মুদ্রণ কারণ আপনি একটি মেমরি অবস্থানের একটি ভেরিয়েবল প্রিন্ট করছেন। যা হয়ত শূন্য বা কোনও পূর্ণসংখ্যা।

আপনি যখন নালটি ব্যবহার করে মুদ্রণ করার চেষ্টা করবেন তবে নালটি Console.WriteLine(null)কোনও চলক নয়, সুতরাং এটি কোনও মেমরির অবস্থান উল্লেখ করে না। এবং তাই এটি ত্রুটি দেয় "NullReferenceException"

তারপরে আপনি কীভাবে কোনও পূর্ণসংখ্যা মুদ্রণ করতে পারবেন Console.WriteLine(2);??

এই ক্ষেত্রে, 2 অস্থায়ী স্থানে মেমরিতে পাবেন এবং পয়েন্টারটি মুদ্রণের জন্য সেই মেমরির অবস্থানটির দিকে নির্দেশ করে।

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