নাল দেওয়া হলে অপারেটরটি মিথ্যা ফিরবে কেন?


135

আমার কাছে মনে হচ্ছে isঅপারেটরটি কিছুটা বেমানান।

bool Test()
{
    // Returns false, but should return true.
    return null is string;
}

একটি প্রত্যাশা করে যে nullমানটি কোনও রেফারেন্সের (বা অবর্ণনীয়) প্রকারের সাথে সম্পর্কিত। এবং প্রকৃতপক্ষে, সি # ভাষার স্পেসিফিকেশন এমন কিছু বলে যা এই অনুমানকে সমর্থন করে, উদাহরণস্বরূপ (6.1.6 অন্তর্ভুক্ত রেফারেন্স রূপান্তর):

অন্তর্নিহিত রেফারেন্স রূপান্তরগুলি হ'ল:
...
ull নাল আক্ষরিক থেকে কোনও রেফারেন্স-ধরণের।

অপারেটরের বিবরণ (10.১০.১০ দ্য ইজ অপারেটর) এই বলে isশুরু হয় যে (E is T)কোনও রেফারেন্স রূপান্তরটি উপস্থিত থেকে পরিবর্তিত হওয়ার Eসাথে অভিব্যক্তিটি সত্য হয়ে উঠবে T, তবে লেখকরা যখন আক্ষরিক হয় বা তার কোনও মান থাকে তখন স্পষ্টভাবে বাদ দিয়ে কেসটি চালিয়ে যান Ethe ।nullnull

তারা এটা কেন করে? আমার কাছে এটিকে বিপরীতমুখী বলে মনে হচ্ছে।


কেন তারা স্পষ্টভাবে নালকে বাদ দিয়েছিল প্রোগ্রামার্স.স্ট্যাকওভারফ্লো
ডটকমের

2
আমি আমার নিকটতম ভোটটি পুনরুদ্ধার
মার্লিন মরগান-গ্রাহাম

null typeof Object
জাভাতেও

ধরুন যে null is stringছিল true, এবং এটি জড়িত যে nullএকটি string। এছাড়াও অনুমান null is Nullable<int>করা হয় true, যে implying nullএকটি হল Nullable<int>। এখন, এই প্রশ্নের উত্তর দিন: কি ধরণের null?
একটি সিভিএন

1
@ মিশেল কেজারলিং: নন সিক্যুটার। উল্লিখিত তথ্যগুলি থেকে (নাল একটি স্ট্রিং, নাল হ'ল একটি নাল <<> এটি অনুসরণ করে না যে আমার সেই প্রশ্নের উত্তর দিতে সক্ষম হওয়া উচিত)।
Gebb

উত্তর:


195

30 মে 2013 এ এই প্রশ্নটি আমার ব্লগের বিষয় ছিল । মহান প্রশ্নের জন্য ধন্যবাদ!


আপনি একটি খালি ড্রাইভওয়েতে তাকাচ্ছেন।

কেউ আপনাকে জিজ্ঞাসা করেছে "আপনার ড্রাইভওয়ে একটি হোন্ডা সিভিক ধরে রাখতে পারে?"

হ্যাঁ. বনভ.

কেউ আপনাকে দ্বিতীয় ড্রাইভওয়েতে নির্দেশ করে। এটিও ফাঁকা। তারা জিজ্ঞাসা করে "আমার ড্রাইভওয়ের বর্তমান সামগ্রীগুলি কি আপনার ড্রাইভওয়েতে ফিট করতে পারে?"

হ্যাঁ, অবশ্যই দুটি ড্রাইভওয়ে খালি! সুতরাং স্পষ্টতই একটির বিষয়বস্তু অন্যটিতে মাপসই করা যায়, কারণ কোনও জায়গাতেই প্রথম স্থানে নেই।

কেউ আপনাকে জিজ্ঞাসা করেছে "আপনার ড্রাইভওয়েতে কি হন্ডা সিভিক রয়েছে?"

না, তা হয় না।

আপনি ভাবছেন যে isঅপারেটর দ্বিতীয় প্রশ্নের উত্তর দেয়: এই মানটি দেওয়া হলে, এটি কি এই ধরণের কোনও ভেরিয়েবলের সাথে খাপ খায়? একটি নাল রেফারেন্স এই ধরণের একটি পরিবর্তনশীল মধ্যে ফিট করে? হ্যাঁ এটা করে.

isঅপারেটর যে প্রশ্নের উত্তর দেয় তা নয়। isঅপারেটর যে প্রশ্নের উত্তর দেয় তা হ'ল তৃতীয় প্রশ্ন। y is Xজিজ্ঞাসা করা হয় না " হয় yধরনের ভেরিয়েবলের একটি আইনি মান X? " এটা বলছেন " Is yপ্রকারের একটি বস্তু একটি বৈধ রেফারেন্স X? " যেহেতু একটি নাল রেফারেন্স একটি বৈধ রেফারেন্স নয় কোন বস্তুর কোনো প্রকার, উত্তর "কোন "। সেই ড্রাইভওয়ে খালি; এতে কোনও হন্ডা সিভিক নেই।

এটি দেখার আরেকটি উপায় হ'ল y is Xপ্রশ্নের উত্তরটি "যদি আমি বললাম y as X, আমি কি নন-নাল ফলাফল পাব? যদি y নাল হয়, স্পষ্টভাবে উত্তরটি না!


আপনার প্রশ্নের দিকে আরও গভীরভাবে দেখার জন্য:

একটি প্রত্যাশা করে যে নাল মানটি কোনও রেফারেন্সের (বা nullable) প্রকারের সাথে সম্পর্কিত

একটি স্পষ্টতই ধরে নেওয়া হবে যে একটি টাইপ মানগুলির একটি সেট , এবং এক্স টাইপের ভেরিয়েবলের সাথে একটি মান y এর অ্যাসাইনমেন্টের সামঞ্জস্যতা y সেট x এর সদস্য কিনা তা যাচাই করার চেয়ে আরও কিছু বা কম নয় ।

যদিও এটি প্রকারগুলি দেখার জন্য অত্যন্ত সাধারণ উপায়, এটি কেবল প্রকারের দিকে তাকানোর একমাত্র উপায় নয় , এবং এটি সি # ধরনগুলিকে যেভাবে দেখায় তা নয়। নাল উল্লেখগুলি সি # তে কোনও প্রকারের সদস্য নয়; নিয়োগ সামঞ্জস্য হয় না নিছক একটি সেট পরীক্ষণ দেখতে যদি এটি একটি মান রয়েছে। কেবলমাত্র নাল রেফারেন্সটি রেফারেন্স টাইপের এক্সের ভেরিয়েবলের সাথে সামঞ্জস্যপূর্ণ অ্যাসাইনমেন্টের অর্থ এই নয় যে নালটি টাইপ এক্স এর একটি সদস্য relation ওভারল্যাপ হয় তবে সেগুলি সিএলআর-তে অভিন্ন নয়।

টাইপ থিওরি সম্পর্কে যদি আপনার আগ্রহ আগ্রহী হয়, তবে বিষয়টিতে আমার সাম্প্রতিক নিবন্ধগুলি দেখুন:

আপনি "টাইপ" বলতে এই জিনিসটি কি? প্রথম অংশ

আপনি "টাইপ" বলতে এই জিনিসটি কি? অংশ দুই


@ জেব্ব: সাহায্য করতে পেরে আনন্দিত। এই নিবন্ধটি আপনার পক্ষেও আগ্রহী হতে পারে: ব্লগস.এমএসএন
এরিক লিপার্ট

এরিক এটিকে একটি ব্লগ পোস্টে রূপান্তরিত করেছেন: ericlippert.com/2013/05/30/ কি- মেনানিং
কেভিন ক্যাথকার্ট

y is Xজিজ্ঞাসা করে না " yধরণের বৈকল্পিকের একটি আইনী মান X?" এটি জিজ্ঞাসা করে " yটাইপের কোনও জিনিসের বৈধ রেফারেন্স কি X?" যে ছিল সমগ্র বিন্দু! ধন্যবাদ!
জালাল

তবে যদি আমি জিজ্ঞাসা করি y is int?, তবে আমি জিজ্ঞাসা করব "আপনার ড্রাইভওয়েতে কোনও হন্ডা নাগরিক রয়েছে কি না?"। আপনার ড্রাইভওয়ে খালি থাকাকালীন উত্তর এখনও কেন নেই? আপনি যদি হুডের নীচে তাকান তবে এটি কেবল আরও খারাপ হয়, কারণ প্রশ্নটি হয়ে ওঠে "আপনার ড্রাইভওয়েতে কোনও হন্ডা সিভিক রয়েছে বা এমন চিহ্ন রয়েছে যা এখানে 'নো হোন্ডা সিভিক' বলে?"। এমনকি যদি আপনার ড্রাইভওয়েতে সাইন চিহ্ন রয়েছে তবে উত্তরটি এখনও নেই।
ফ্যাক্স

1
@ গার্ডার্ড: আমি যখন দীর্ঘ, শব্দচয়ন, চটি উত্তর দিয়ে থাকি তখন লোকেরা আমাকে বলে যে তাদের খাটো হওয়া উচিত, এবং যখন আমি সংক্ষিপ্ত করি, লোকেরা আমাকে বলে যে তাদের দীর্ঘ হওয়া উচিত। আমার উপসংহারটি হ'ল: লোকেরা অভিযোগ করতে পছন্দ করে। যেহেতু আট বছর বয়সী এই প্রশ্নের উত্তর কীভাবে দেয় সে সম্পর্কে আপনার অনুভূতি রয়েছে, তাই আমার পরামর্শ হ'ল আপনি নিজেরাই উত্তর দিন যা একটি ভাল উত্তর দেয় তা আমাদের দেখান, যাতে আমরা শিখতে পারি।
এরিক লিপার্ট

24

আমি মনে করি null is stringমিথ্যা ফিরিয়ে দেওয়া খুব স্বজ্ঞাত। নুল অর্থ কিছুই নয়, এবং এটি অবশ্যই একটি স্ট্রিং নয়। সুতরাং এটি মিথ্যা ফিরে উচিত। ভাষা ডিজাইনাররা এটি পছন্দ হিসাবে বিবেচনা করলে, আপনি যখন শূন্যতার আসল বিশ্বের অর্থ বিবেচনা করেন তখন এটি খুব স্বজ্ঞাত হয়।


2
+1 কারণ প্রশ্নটি সত্যই এটি স্বজ্ঞাত কিনা এবং সেই অনুমানটিকে প্রশ্নবিদ্ধ করছে না, যা ওপি ইতিমধ্যে জানে। আপনি একটি ইংরেজী বাক্য যেমন জিজ্ঞাসা তাহলে "is nullউত্তর নেই, তাই নয় কি, যা থেকে ভিন্ন একটি স্ট্রিং" "হয় nullহস্তান্তরযোগ্য করতে string"
Davy8

null is stringবেশ স্বজ্ঞাত, (string)null is stringযদি আপনি সি # তে নাল রেফারেন্স কীভাবে কাজ করে সে সম্পর্কে আপনি সত্যিই পরিচিত না হন তবে একটি বিরামের প্রয়োজন হতে পারে।
decPL

24

nullআক্ষরিক নির্ধারিত করা যেতে পারে কোন রেফারেন্স প্রকার। এটা না নিজেই একটি একটি প্রকার। এটা একটা বিশেষ আক্ষরিক যে প্রতিনিধিত্ব করে একটি নাল রেফারেন্স।

যে ক্ষেত্রে যখন পাস হবে তখন isফিরে আসবে, আপনি আক্ষরিক সাথে কী করতে সক্ষম হবেন ? কিছুই না - এটা । বিভ্রান্তিকর বিষয় বাদে এর ফিরে আসার কী লাভ হবে ?truenullnullnulltrue


নির্বিশেষে - এটি কতটা স্বজ্ঞাততার দিক থেকে, ইংরেজীতে কোডটি পড়ুন এবং আমাকে বলুন:

null is string;

আমি যখন এটি দেখি, মনে হয় এটি প্রশ্ন জিজ্ঞাসা করা হবে is "nothing" a string?। আমার অন্তর্নিহিততা আমাকে বলে যে না, তা নয় - তাই nothing


ঠিক আছে, তবে তারপরেও এটি একটি স্ট্রিং, তাই না? তবে কেন (null is string)ফেরত ফ্লাস হয়?
Gebb

আমি এটিকে অন্যভাবে বলতাম sed যে কোনও রেফারেন্স টাইপ নালার হতে পারে। নাল শুধু নাল।
মার্ক এইচ

@ সংযুক্ত তাই নাল মানটি কি অবজেক্টের ধরণের মান বলে? আমি এই ধরণের একটি ভেরিয়েবল এটাকে নির্ধারণ করতে পারি, তাই না? সুতরাং উত্তরটি হ্যাঁ বলে মনে হচ্ছে, মানটি পুরোপুরি বৈধ, এবং আমার অনুমান যে (null is object)অভিব্যক্তিটি ঠিক এটি পরীক্ষা করা উচিত।
Gebb

@ জেব্ব: ভুলে যাবেন না যে ভ্যালু টাইপগুলিও বস্তু, তবে রেফারেন্সের ধরণের নয়।
মার্ক এইচ

1
@ ওডে: "বিভ্রান্তিকর বিষয় বাদে এর সত্যতা ফিরে আসার কী লাভ হবে?" আসলে, এটি ভাষাটিকে আরও যুক্তিযুক্ত করে তুলবে। এই দুটি বিষয় বিবেচনা করুন: (1) isঅপারেটর যদি কোনও রেফারেন্স (আমাদের এখানে অন্য ধরণের রূপান্তর প্রয়োজন না) রূপান্তর বিদ্যমান থাকে তা পরীক্ষা করে; (২) nullযে কোনও রেফারেন্স ধরণে রূপান্তর করা যায়। সুতরাং (null is T), যেখানে টি একটি রেফারেন্স টাইপ সত্য হওয়া উচিত। তবে না, এখানে আমাদের স্পষ্ট ব্যতিক্রম রয়েছে, যা আমার কাছে বিভ্রান্ত বলে মনে হয়।
Gebb

12

http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.71%29.aspx

নিম্নোক্ত দুটি শর্ত পূরণ হলেই একটি প্রকাশটি সত্যের মূল্যায়ণ হয়:

  • অভিব্যক্তি নাল নয়।
  • এক্সপ্রেশন টাইপ করা যেতে পারে। এটি হ'ল, ফর্মের একটি castালাই প্রকাশ (ধরণ (এক্সপ্রেশন)) ব্যতিক্রম ছাড়াই সম্পূর্ণ হবে more আরও তথ্যের জন্য দেখুন 7.6.6 কাস্ট এক্সপ্রেশন।

1
যাইহোক ডকুমেন্টেশনে কেবল বর্ণিত হয়েছে যে অভিব্যক্তিটি নালার হতে পারে না (যা আমরা ইতিমধ্যে জানি) তবে এটি কেন জানায় না
ইউজারনেম

আপনি অন্য কোনও উপায়ে কেন এটি চান?
দুর্বল পরিবর্তনশীল

1
@ ব্যবহারকারীর নাম: এই উত্তরটি যান্ত্রিকভাবে কীভাবে কাজ করে তা ব্যাখ্যা করে এবং একটি উল্লেখ উল্লেখ করে, যা আপনাকে কাজ করার জন্য একটি মডেল দেয়। আপনি এখানে মহাবিশ্বের অর্থ জিজ্ঞাসা করছেন। আমার অনুমান যে আপনি ভাগ্যবান যে আমাদের god
শ্বরও

10

ব্যবহারিক বিষয় হিসাবে, "নাল হ'ল টি == ভুয়া" আমার অতিরিক্ত কোড টাইপ করে সংরক্ষণ করে:

পরিবর্তে বলার অপেক্ষা রাখে না

if (X != null && X is Foo) {}

আমি শুধু বলতে পারি

if (X is Foo) {}

এবং এটি দিয়ে করা।


8

nullমান

আমি আপনার প্রশ্ন থেকে এটি উদ্ধৃত করেছি কারণ এটি মনে হয় যে বিষয়টি বিষয়টি মনে রাখে। null নয় একটি মান - এটি একটি মান অভাবে আছে। আমার উদ্দেশ্য isমনে হয় এই প্রশ্নের উত্তর দেওয়া:

যদি আমি নিক্ষেপ Eকরতে T, আমি সফলভাবে একটি পাবেন T?

এখন, আপনি যখন পারেন নিক্ষেপ nullকরতে T ত্রুটি ছাড়া , করছেন পরে যাতে আপনি না "একটি আছে T" - আপনি কি এখনও পেয়েছেন কিছুই নেই। সুতরাং এটি null"এ" এর মতো নয় T, তাই isমিথ্যা প্রত্যাবর্তন করে।


3

জাভা কোনও চালক যে ঠিক একই জিনিস আছে আছে, কিন্তু এটা অনেক লম্বা নাম রয়েছে: instanceof। এটি সেখানে খুব স্বজ্ঞাত যে null instanceof Stringমিথ্যা প্রত্যাবর্তন করে, কারণ নাল কোনও কিছুর উদাহরণ নয়, খুব কম এ String। সুতরাং, nullজাভা সংস্করণ ব্যবহার করার সময় কিছুটা স্বজ্ঞাত।

যাইহোক, পুরো অপারেশনটিও দেখতে বললে those অপারেটর দু'জনই সত্য হয়ে যায়। যেমন। উদাহরণস্বরূপ Stringযদি একটি হয় Object। এবং এখানে এটা কম স্বজ্ঞাত বিট যে এবং C # (কারণ একটি দৃষ্টান্ত আসলে এক, খুব নির্দিষ্ট ধরনের আছে) 's জাভার isআরও বেশি ধারণাসম্পন্ন হয় (কারণ যে String হয় একটি Objectগভীর ভিতরে)।

নীচের লাইন: আপনি যদি এক কথায় বেশ উন্নত যুক্তি বর্ণনা করার চেষ্টা করেন, আপনি এই ভাবে বা অন্য কোনও লোককে বিভ্রান্ত করতে বাধ্য or দেখে মনে হচ্ছে বেশিরভাগ লোকেরা একটি অর্থের সাথে একমত হয়েছিল এবং যারা সম্মত হননি তাদের সামঞ্জস্য করতে হয়েছিল।

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