এই কোডটি কেন একটি "সম্ভাব্য নাল রেফারেন্স রিটার্ন" সংকলক সতর্কতা দেয়?


70

নিম্নলিখিত কোড বিবেচনা করুন:

using System;

#nullable enable

namespace Demo
{
    public sealed class TestClass
    {
        public string Test()
        {
            bool isNull = _test == null;

            if (isNull)
                return "";
            else
                return _test; // !!!
        }

        readonly string _test = "";
    }
}

যখন আমি এই সংগ্রহ করতে, লাইন দিয়ে চিহ্নিত করা !!!একটি কম্পাইলার সতর্কবার্তা দেয়: warning CS8603: Possible null reference return.।

_testকেবলমাত্র পঠনযোগ্য এবং অ-শূন্যে প্রারম্ভিকভাবে দেওয়া এটিকে আমি কিছুটা বিভ্রান্ত মনে করি ।

আমি কোডটি নিম্নলিখিতটিতে পরিবর্তন করলে, সতর্কতাটি চলে যায়:

        public string Test()
        {
            // bool isNull = _test == null;

            if (_test == null)
                return "";
            else
                return _test;
        }

কেউ কি এই আচরণ ব্যাখ্যা করতে পারেন?


1
ডিবাগ.আসর্ট অপ্রাসঙ্গিক কারণ এটি রানটাইম চেক, অন্যদিকে সংকলক সতর্কতা একটি সংকলন সময় পরীক্ষা check সংকলকটির রানটাইম আচরণে অ্যাক্সেস নেই।
— পলিফুন

5
The Debug.Assert is irrelevant because that is a runtime check- এটি হল প্রাসঙ্গিক কারণ যদি আপনি যে লাইন মন্তব্য সতর্কবাণী দূরে চলে যায়।
— ম্যাথু ওয়াটসন

1
@ পলিফুন: সংকলকটি সম্ভাব্যভাবে জানতে পারে (গুণাবলীর মাধ্যমে) যা Debug.Assertপরীক্ষা ব্যর্থ হলে একটি ব্যতিক্রম ছুঁড়ে ফেলবে।
— জন স্কেটি

2
আমি এখানে প্রচুর বিভিন্ন কেস যুক্ত করছি, এবং এর কিছু সত্যই আকর্ষণীয় ফলাফল রয়েছে। পরে একটি উত্তর লিখবে - আপাতত কাজ করার জন্য কাজ করুন।
— জন স্কিটি

2
@EricLippert: Debug.Assertএখন একটি টীকা (হয়েছে src এর) DoesNotReturnIf(false)শর্ত পরামিতি জন্য।
— জন স্কিটি

উত্তর:


38

অবিচ্ছিন্ন প্রবাহ বিশ্লেষণটি ভেরিয়েবলের নাল অবস্থা ট্র্যাক করে , তবে এটি অন্যান্য রাষ্ট্র যেমন boolভেরিয়েবলের মান ( isNullউপরে হিসাবে ) ট্র্যাক করে না এবং পৃথক ভেরিয়েবলের (যেমন isNullএবং _test) অবস্থার মধ্যে সম্পর্ককে ট্র্যাক করে না ।

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

এটি আমরা সি # সংকলক সরাসরি করতে পারি এমন কিছু নয়। অযোগ্য সতর্কতার জন্য নিয়মগুলি বেশ পরিশীলিত (যেমন জনসের বিশ্লেষণ দেখায়!) তবে সেগুলি নিয়ম, এবং এ সম্পর্কে যুক্তিযুক্ত হতে পারে।

আমরা বৈশিষ্ট্যটি রোল করার সময় মনে হয় যে আমরা বেশিরভাগ ক্ষেত্রে সঠিক ভারসাম্যকে আঘাত করেছি, তবে কয়েকটি জায়গা রয়েছে যা বিশ্রী হিসাবে উঠে এসেছে এবং আমরা সি # 9.0 এর জন্য আবার ঘুরে দেখব।


3
আপনি জানেন যে আপনি স্পেসিফিকেশনে জালিক তত্ত্বটি স্থাপন করতে চান; জাল থিরি দুর্দান্ত এবং মোটেই বিভ্রান্তিকর নয়! এটা কর! :)
— এরিক লিপার্ট

7
যখন আপনি সি # এর প্রোগ্রাম ম্যানেজার সাড়া দেয় তখন আপনার প্রশ্নটি বৈধ!
— স্যাম রুয়েবি

1
@ তানভীরবাদার: ল্যাটিক্স তত্ত্বটি আংশিক ক্রমযুক্ত মানগুলির সেটগুলির বিশ্লেষণ সম্পর্কে; প্রকারভেদ একটি ভাল উদাহরণ; টাইপ এক্স এর মান যদি Y প্রকারের ভেরিয়েবলের জন্য নির্ধারিত হয় তবে এর থেকে বোঝা যায় যে এক্স ধরে রাখা ওয়াই "যথেষ্ট বড়", এবং এটি একটি জালিকা তৈরির জন্য যথেষ্ট, যা আমাদের জানায় যে সংকলকটিতে কার্যনির্বাহীকরণ পরীক্ষা করার জন্য এটি বিভক্ত হতে পারে জাল তত্ত্বের ক্ষেত্রে স্পেসিফিকেশন। এটি স্থির বিশ্লেষণের সাথে প্রাসঙ্গিক কারণ প্রকারের অ্যাসাইনবিলিটি ব্যতীত কোনও বিশ্লেষকের কাছে আগ্রহের দুর্দান্ত অনেকগুলি বিষয়ও ল্যাটিকগুলির ক্ষেত্রে স্পষ্ট।
— এরিক লিপার্ট

1
@ তানভীরবাদার: লারা.এফএফএল.সিচ / ডাব্লু_মিডিয়া / স্যাভ 08: schwartzbach.pdf স্থির বিশ্লেষণ ইঞ্জিনগুলি কীভাবে জাল থিওরি ব্যবহার করে তার কয়েকটি প্রারম্ভিক উদাহরণ রয়েছে।
— এরিক লিপার্ট

1
@ এরিকলিপার্ট আশ্চর্যজনক আপনার বর্ণনা দিতে শুরু করে না। এই লিঙ্কটি এখনই আমার পড়ার তালিকায় চলেছে।
— তানভীর বদর

56

এখানে কী চলছে তা সম্পর্কে আমি একটি যুক্তিসঙ্গত অনুমান করতে পারি, তবে এটি কিছুটা জটিল :) এটি খসড়া স্পেসে বর্ণিত নাল অবস্থা এবং নাল ট্র্যাকিংয়ের সাথে জড়িত । মৌলিকভাবে, আমরা যে বিন্দুতে ফিরে আসতে চাইছি সেখানে সংকলক সতর্ক করবে যে যদি "নাল নয়" পরিবর্তে অভিব্যক্তিটির অবস্থা "সম্ভবত নাল" হয়।

এই উত্তরটি "এখানে" উপসংহারগুলি "না দিয়ে কিছুটা বর্ণনামূলক আকারে রয়েছে ... আমি আশা করি এটি সেভাবে আরও কার্যকর।

আমি ক্ষেত্রগুলি থেকে মুক্তি পেয়ে উদাহরণটিকে কিছুটা সহজ করতে যাচ্ছি, এবং এই দুটি স্বাক্ষরের একটি সহ একটি পদ্ধতি বিবেচনা করব:

public static string M(string? text)
public static string M(string text)

নীচের বাস্তবায়নে আমি প্রতিটি পদ্ধতিকে একটি আলাদা সংখ্যা দিয়েছি যাতে আমি নির্দিষ্ট উদাহরণগুলি স্পষ্টতই উল্লেখ করতে পারি। এটি বাস্তবায়নের সকলকে একই প্রোগ্রামে উপস্থিত হতে দেয়।

নীচে বর্ণিত প্রতিটি ক্ষেত্রে আমরা বিভিন্ন কাজ করব তবে ফিরে আসার চেষ্টা করব text- সুতরাং এটি textগুরুত্বপূর্ণ that's

শর্তহীন প্রত্যাবর্তন

প্রথমে আসুন এটি সরাসরি ফেরত দেওয়ার চেষ্টা করি:

public static string M1(string? text) => text; // Warning
public static string M2(string text) => text;  // No warning

এতদূর, এত সহজ। পদ্ধতি শুরুতে প্যারামিটারের nullable রাষ্ট্র যদি এটা ধরনের এর "হয়তো নাল" হয় string?"নাল নয়" এবং এটি যদি ধরনের এর string।

সাধারণ শর্তসাপেক্ষে ফিরে আসা

এখন আসুন ifশর্তাবলীর মধ্যেই নালটি পরীক্ষা করা যাক । (আমি শর্তসাপেক্ষ অপারেটরটি ব্যবহার করব, যা আমি বিশ্বাস করি যে একই প্রভাব ফেলবে, তবে আমি প্রশ্নটির সত্যবাদী হতে চেয়েছিলাম))

public static string M3(string? text)
{
    if (text is null)
    {
        return "";
    }
    else
    {
        return text; // No warning
    }
}

public static string M4(string text)
{
    if (text is null)
    {
        return "";
    }
    else
    {
        return text; // No warning
    }
}

দুর্দান্ত, সুতরাং এটি একটি ifবিবৃতিতে দেখে মনে হচ্ছে যেখানে শর্তটি নিজেই শূন্যতার জন্য যাচাই করে, ifবিবৃতিটির প্রতিটি শাখার মধ্যে পরিবর্তকের অবস্থা আলাদা হতে পারে: elseব্লকের মধ্যে, উভয় কোডের কোডে রাজ্য "নাল নয়"। সুতরাং বিশেষত, এম 3-তে রাষ্ট্র "সম্ভবত নাল" থেকে "নাল নয়" তে পরিবর্তিত হয়।

স্থানীয় ভেরিয়েবলের সাথে শর্তসাপেক্ষ রিটার্ন

এখন স্থানীয় শর্তে সেই শর্তটি উত্তোলনের চেষ্টা করা যাক:

public static string M5(string? text)
{
    bool isNull = text is null;
    if (isNull)
    {
        return "";
    }
    else
    {
        return text; // Warning
    }
}

public static string M6(string text)
{
    bool isNull = text is null;
    if (isNull)
    {
        return "";
    }
    else
    {
        return text; // Warning
    }
}

এম 5 এবং এম 6 উভয়ই সতর্কতা জারি করে। সুতরাং কেবলমাত্র আমরা এম 5-তে "সম্ভবত নাল" থেকে "নাল নয়" থেকে রাষ্ট্র পরিবর্তনের ইতিবাচক প্রভাব পাই না (যেমন এম 3 তেও করেছি) ... আমরা এম 6-তে বিপরীত প্রভাব পেয়েছি , যেখানে রাজ্যটি " নাল নয় "থেকে" সম্ভবত নাল "। যা আমাকে সত্যিই অবাক করেছে।

সুতরাং দেখে মনে হচ্ছে আমরা এটি শিখেছি:

  • রাষ্ট্রীয় তথ্য প্রচারের জন্য "স্থানীয় ভেরিয়েবলটি কীভাবে গণনা করা হয়েছিল" এর চারপাশে যুক্তি ব্যবহার করা হয় না। আরও পরে।
  • একটি নাল তুলনা পরিচয় করিয়ে সংকলককে সতর্ক করতে পারে যে এটি পূর্বে যা কিছু শূন্য ছিল না বলে মনে হয়েছিল তা সর্বোপরি নਾਲ হতে পারে।

উপেক্ষিত তুলনার পরে শর্তহীন প্রত্যাবর্তন

আসুন এই বুলেট পয়েন্টগুলির দ্বিতীয়টি দেখুন, নিঃশর্ত ফেরতের আগে একটি তুলনা প্রবর্তন করে। (সুতরাং আমরা তুলনার ফলাফলটিকে সম্পূর্ণ উপেক্ষা করছি)):

public static string M7(string? text)
{
    bool ignored = text is null;
    return text; // Warning
}

public static string M8(string text)
{
    bool ignored = text is null;
    return text; // Warning
}

এম 8 এর মতো মনে হয় এম 2 এর সমতুল্য হওয়া উচিত - উভয়ের একটি নন-নাল প্যারামিটার রয়েছে যা তারা নিঃশর্ত ফিরে আসে - তবে নলের সাথে একটি তুলনা প্রবর্তন করে রাষ্ট্রটিকে "নাল নয়" থেকে "সম্ভবত নাল" করে দেয়। textশর্তের আগে ডিসেরেন্স করার চেষ্টা করে আমরা এর আরও প্রমাণ পেতে পারি :

public static string M9(string text)
{
    int length1 = text.Length;   // No warning
    bool ignored = text is null;
    int length2 = text.Length;   // Warning
    return text;                 // No warning
}

returnবিবৃতিতে এখন কীভাবে সতর্কতা নেই তা নোট করুন : কার্যকর করার পরে রাষ্ট্রটি text.Length"নাল নয়" (কারণ যদি আমরা সেই অভিব্যক্তিটি সফলভাবে সম্পাদন করি তবে এটি নাল হতে পারে না)। সুতরাং textপ্যারামিটারটি তার ধরণের কারণে "নাল নয়" হিসাবে শুরু হয়, নাল তুলনার কারণে "সম্ভবত নাল" হয়ে যায়, তার পরে আবার "নাল নয়" হয়ে যায় text2.Length।

কোন তুলনা রাষ্ট্রকে প্রভাবিত করে?

সুতরাং এটি একটি তুলনা text is null... অনুরূপ তুলনা কি প্রভাব আছে? এখানে আরও চারটি পদ্ধতি রয়েছে, সবগুলি একটি অ-শনীয় স্ট্রিং প্যারামিটার দিয়ে শুরু করে:

public static string M10(string text)
{
    bool ignored = text == null;
    return text; // Warning
}

public static string M11(string text)
{
    bool ignored = text is object;
    return text; // No warning
}

public static string M12(string text)
{
    bool ignored = text is { };
    return text; // No warning
}

public static string M13(string text)
{
    bool ignored = text != null;
    return text; // Warning
}

সুতরাং যদিও x is objectএখন একটি প্রস্তাবিত বিকল্প নেই x != null, তারা একই প্রভাব না: শুধুমাত্র একটি তুলনা নাল সঙ্গে (সাথে is, ==বা !=) "হয়তো নাল" থেকে "না নাল" থেকে রাষ্ট্র পরিবর্তন।

শর্ত উত্তোলনের একটি প্রভাব আছে কেন?

এর আগে আমাদের প্রথম বুলেট পয়েন্টে ফিরে গিয়ে, কেন এম 5 এবং এম 6 লোকাল ভেরিয়েবলের দিকে পরিচালিত শর্তটি বিবেচনা করবে না? এটি আমাকে ততটা অবাক করে না যতটা অন্যকে অবাক করে তোলে। সংকলক এবং স্পেসিফিকেশনের মধ্যে এই ধরণের যুক্তি তৈরি করা অনেক কাজ, এবং তুলনামূলকভাবে খুব সামান্য উপকারের জন্য। এখানে শূন্যতার সাথে কিছুই না করার জন্য এখানে আরও একটি উদাহরণ রয়েছে যেখানে কিছু কিছু অন্তর্ভুক্ত করার ফলে প্রভাব পড়ে:

public static int X1()
{
    if (true)
    {
        return 1;
    }
}

public static int X2()
{
    bool alwaysTrue = true;
    if (alwaysTrue)
    {
        return 1;
    }
    // Error: not all code paths return a value
}

যদিও আমরা জানি যে alwaysTrueসর্বদা সত্য হবে, তবুও এটি বিবরণে প্রয়োজনীয়তাগুলি পূরণ করে না ifযা বিবৃতিটির পরে কোডটি অ্যাক্সেসযোগ্য করে তোলে যা আমাদের প্রয়োজন।

এখানে আরও একটি উদাহরণ, নির্দিষ্ট কার্যভারের আশেপাশে:

public static void X3()
{
    string x;
    bool condition = DateTime.UtcNow.Year == 2020;
    if (condition)
    {
        x = "It's 2020.";
    }
    if (!condition)
    {
        x = "It's not 2020.";
    }
    // Error: x is not definitely assigned
    Console.WriteLine(x);
}

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


7
দুর্দান্ত বিশ্লেষণ জন। কভারিটি চেকার অধ্যয়ন করার সময় আমি যে মূল জিনিসটি শিখেছিলাম তা হ'ল কোডটি তার লেখকদের বিশ্বাসের প্রমাণ । যখন আমরা একটি নাল চেক দেখতে পাই যা আমাদের জানিয়ে দিতে হবে যে কোডটির লেখকরা বিশ্বাস করেছিলেন যে চেকটি প্রয়োজনীয়। পরীক্ষক প্রকৃতপক্ষে প্রমাণ খুঁজছেন যে লেখকের বিশ্বাসগুলি অসঙ্গত ছিল কারণ এটি সেই জায়গাগুলি যেখানে আমরা দেখতে পাই না যে, নালাগুলি, যে বাগগুলি ঘটেছিল সে সম্পর্কে অসঙ্গত বিশ্বাসগুলি।
— এরিক লিপার্ট

6
যখন আমরা উদাহরণস্বরূপ দেখতে পাই তখন আমাদের if (x != null) x.foo(); x.bar();কাছে দুটি প্রমাণ রয়েছে; ifবিবৃতি প্রতিজ্ঞা এর "লেখক বিশ্বাস করে যে এক্স foo বিন্যাস থেকে কল করার আগে নাল হতে পারে" প্রমাণ নেই এবং নিম্নোক্ত বিবৃতি এর "লেখক বিশ্বাস এক্স নাল আগে কল বার নয়" প্রমাণ, এবং এই দ্বন্দ্ব বিশালাকার একটি ত্রুটি আছে যে উপসংহার বাগটি অপ্রয়োজনীয় নাল চেকের তুলনামূলকভাবে সৌম্য বাগ, অথবা সম্ভাব্য ক্র্যাশিং বাগ either কোন বাগটি আসল বাগটি পরিষ্কার তা পরিষ্কার নয়, তবে এটি পরিষ্কার যে এটি একটি।
— এরিক লিপার্ট

1
অপেক্ষাকৃত অবাস্তব চেকাররা যা স্থানীয়দের অর্থ বোঝায় না এবং "মিথ্যা পাথ" ছাঁটাই করে না - যে প্রবাহের পথগুলি মানুষ আপনাকে বলতে পারে তা অসম্ভব - সঠিকভাবে মিথ্যা ইতিবাচকতা তৈরি করার প্রবণতা কারণ তারা সঠিকভাবে মডেল করেননি have লেখকদের বিশ্বাস। এটুকু মুশকিল!
— এরিক লিপার্ট

3
"অবজেক্ট", "হ'ল।}" এবং "! = নাল" এর মধ্যে অসঙ্গতি এমন একটি আইটেম যা আমরা গত কয়েক সপ্তাহ ধরে অভ্যন্তরীণভাবে আলোচনা করছি। একে একে খাঁটি নাল চেক হিসাবে বিবেচনা করা দরকার কিনা (যা আচরণটি সামঞ্জস্যপূর্ণ করে তোলে) সিদ্ধান্ত নেওয়ার জন্য খুব অদূর ভবিষ্যতে এলডিএম-এ এটি নিয়ে আসছি।
— জেয়ার্ডপাড়

1
@ অ্যারোন অ্যাক্সেলরোড এটি বলছে যে এটি নালু হওয়ার অর্থ নয় । এটি এখনও নাল হতে পারে, কারণ অযোগ্য রেফারেন্স টাইপগুলি কেবল একটি সংকলক ইঙ্গিত। (উদাহরণস্বরূপ: এম 8 (নাল!); বা এটি সি # 7 কোড থেকে কল করা বা সতর্কতাগুলি উপেক্ষা করা)) এটি প্ল্যাটফর্মের বাকী অংশের মতো সুরক্ষার মতো নয়।
— জন স্কিটি

29

আপনি প্রমাণ পেয়েছেন যে প্রোগ্রাম-ফ্লো অ্যালগরিদম যে এই সতর্কতাটি উত্পন্ন করে তা স্থানীয় ভেরিয়েবলগুলিতে এনকোড হওয়া অর্থগুলি ট্র্যাক করার ক্ষেত্রে তুলনামূলকভাবে অযাচিত।

আমার কাছে ফ্লো চেকারের বাস্তবায়নের কোনও নির্দিষ্ট জ্ঞান নেই, তবে অতীতে অনুরূপ কোডের প্রয়োগে কাজ করে আমি কিছু শিক্ষিত অনুমান করতে পারি। প্রবাহ চেকার সম্ভবত মিথ্যা পজিটিভ ক্ষেত্রে দুটি জিনিস কেটে নিচ্ছে: (1) বাতিল _testহতে পারে, কারণ এটি না পারলে প্রথম স্থানে আপনার তুলনা হবে না, এবং (2) isNullসত্য বা মিথ্যা হতে পারে - কারণ যদি এটি না পারে, আপনি এটি একটি এ না থাকতেন if। তবে কেবল সংযোগটি return _test;যদি _testশূন্য না হয় তবে এটি সংযোগ তৈরি হচ্ছে না।

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

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


"অকৃত্রিম" সঠিক হয় - আমি এটা মার্জনীয় বিবেচনা যদি এটা কন্ডিশন মতো জিনিসের উপর হোঁচট খায়, আমরা সব জানি বিরাম সমস্যা যেমন বিষয়ে একটি কঠিন বাদাম একটি বিট, কিন্তু আসলে তার মাঝে এ সব একটা পার্থক্য যে bool b = x != nullবনাম bool b = x is { }(সঙ্গে কার্যত ব্যবহৃত অ্যাসাইনমেন্ট!) দেখায় যে নাল চেকগুলির জন্য স্বীকৃত নিদর্শনগুলিও সন্দেহজনক। এই কাজটি বেশিরভাগ ক্ষেত্রে বাস্তবের অভ্যন্তরীণ কোড ঘাঁটির জন্য করা উচিত বলে নিঃসন্দেহে দলের কঠোর পরিশ্রমকে অস্বীকার না করা - দেখে মনে হচ্ছে বিশ্লেষণ মূলধন-পি ব্যবহারিক।
— জেরোইন মোস্টার্ট

@ জিরোয়ানমস্টার্ট: জ্যারেড পার জোন স্কিটের উত্তরের একটি মন্তব্যে উল্লেখ করেছেন যে মাইক্রোসফ্ট অভ্যন্তরীণভাবে এই বিষয়টি নিয়ে আলোচনা করছে।
— ব্রায়ান

8

অন্যান্য সমস্ত উত্তর বেশ সঠিকভাবে সঠিক।

কারও কৌতূহলের ক্ষেত্রে, আমি https://github.com/dotnet/roslyn/issues/36927#issuecomment-508595947 এ স্পষ্ট করে যতটা সম্ভব স্পষ্টতই সংকলকটির যুক্তিটি বানান চেষ্টা করেছি

যে অংশটি উল্লেখ করা হয়নি তা হ'ল আমরা কীভাবে নাল চেকটিকে "খাঁটি" হিসাবে বিবেচনা করা উচিত কিনা তা এই সিদ্ধান্তে সিদ্ধান্ত নিই যে আপনি যদি এটি করেন তবে নাল একটি সম্ভাবনা কিনা তা আমাদের গুরুত্ব সহকারে বিবেচনা করা উচিত। সি # তে প্রচুর "ঘটনাবহুল" নাল চেক রয়েছে, যেখানে আপনি অন্য কিছু করার অংশ হিসাবে নাল পরীক্ষা করে দেখেন, তাই আমরা স্থির করেছিলাম যে আমরা চেকগুলির সেটগুলি সংকীর্ণ করতে চেয়েছিলাম যে আমরা নিশ্চিত যে লোকেরা ইচ্ছাকৃতভাবে করছে। আমরা যে তাত্ত্বিকতা নিয়ে এসেছি তা হ'ল "নাল শব্দটি অন্তর্ভুক্ত", তাই সে কারণেই x != nullএবং x is objectবিভিন্ন ফলাফল উত্পন্ন করে।

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