সি # তে আদিমদের জন্য == এবং সমান () এর মধ্যে পার্থক্য কী?


180

এই কোডটি বিবেচনা করুন:

int age = 25;
short newAge = 25;
Console.WriteLine(age == newAge);  //true
Console.WriteLine(newAge.Equals(age)); //false
Console.ReadLine();

উভয়ই intএবং shortআদিম ধরণের, তবে প্রত্যাশার সাথে ==সত্যের তুলনা এবং Equalsপ্রত্যাবর্তনের সাথে মিথ্যা।

কেন?


9
@ ওরেঞ্জডগ দয়া করে প্রশ্ন সম্পর্কে চিন্তা করুন এবং তারপরে ভোট দিন

4
এই সুস্পষ্ট বিপরীত প্রয়াস অনুপস্থিতConsole.WriteLine(age.Equals(newAge));
ANeves

3
সদৃশ এই আচরণটি ব্যাখ্যা করে না; এটি Equals()সাধারণভাবে যা ঘটে তা সম্পর্কে ।
স্ল্যাक्स

37
আমি এই সঠিক প্রশ্নের উত্তর কয়েক দিন আগে কভারিটি ব্লগে দিয়েছি। blog.coverity.com/2014/01/13/ অসংগতি- সমতা
এরিক লিপার্ট

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

উত্তর:


262

সংক্ষিপ্ত উত্তর:

সমতা জটিল।

বিস্তারিত উত্তর:

প্রিমিটিভ টাইপগুলি বেসটি ওভাররাইড করে object.Equals(object)এবং বাক্স objectএকই ধরণের এবং মানের হয় তবে সত্য হয় return (দ্রষ্টব্য যে এটি ক্ষয়যোগ্য প্রকারের জন্যও কাজ করবে; নন-নাল nallable প্রকারগুলি অন্তর্নিহিত ধরণের উদাহরণ হিসাবে সর্বদা বাক্স থাকে))

যেহেতু newAgeএকটি short, Equals(object)তাই আপনি যদি একই মানের সাথে একটি বাক্স সংক্ষিপ্ত পাস করেন তবে এর পদ্ধতিটি কেবল সত্যটি প্রত্যাবর্তন করে । আপনি একটি বাক্সযুক্ত উত্তীর্ণ int, তাই এটি মিথ্যা ফিরে।

বিপরীতে, ==অপারেটর দুটি intগুলি (বা shortগুলি বা longগুলি) গ্রহণ হিসাবে সংজ্ঞায়িত করা হয় ।
যখন আপনি এটি একটি কল intএবং short, কম্পাইলার পরোক্ষভাবে রূপান্তর করবে shortকরার intএবং তার ফলে তুলনা intমান গুলি।

এটি কাজ করার অন্যান্য উপায়

আদিম ধরণেরগুলির নিজস্ব Equals()পদ্ধতি রয়েছে যা একই ধরণের গ্রহণ করে।
আপনি যদি লিখেন age.Equals(newAge), সংকলক int.Equals(int)সেরা ওভারলোড হিসাবে নির্বাচন করবে এবং স্পষ্টত রূপান্তরিত shortকরবে int। এটি তখন ফিরে আসবে true, যেহেতু এই পদ্ধতিটি কেবলমাত্র সরাসরিগুলির সাথে তুলনা করে int

shortএছাড়াও একটি short.Equals(short)পদ্ধতি আছে, কিন্তু intস্পষ্টভাবে রূপান্তর করা যায় না short, তাই আপনি এটি কল করছেন না।

আপনি একটি কাস্ট দিয়ে এই পদ্ধতিটি কল করতে বাধ্য করতে পারেন:

Console.WriteLine(newAge.Equals((short)age)); // true

short.Equals(short)এটি বক্সিং ছাড়াই সরাসরি কল করবে । যদি age32767 এর চেয়ে বড় হয় তবে এটি একটি ওভারফ্লো ব্যতিক্রম ছুঁড়ে দেবে।

আপনি short.Equals(object)ওভারলোডকেও কল করতে পারেন , তবে স্পষ্টভাবে একটি বক্সযুক্ত বস্তুটি পাস করুন যাতে এটি একই ধরণের হয়:

Console.WriteLine(newAge.Equals((object)(short)age)); // true

পূর্ববর্তী বিকল্পের মতো, এটি কোনও ক্ষেত্রে ফিট না হলে এটি একটি ওভারফ্লো ফেলে দেবে short। পূর্ববর্তী সমাধানের বিপরীতে, এটি shortসময় এবং স্মৃতি নষ্ট করে একটি বস্তুকে বক্স করবে ।

সোর্স কোড:

Equals()আসল উত্স কোড থেকে দুটি পদ্ধতি এখানে রয়েছে :

    public override bool Equals(Object obj) {
        if (!(obj is Int16)) {
            return false;
        }
        return m_value == ((Int16)obj).m_value;
    }

    public bool Equals(Int16 obj)
    {
        return m_value == obj;
    }

আরও পড়া:

এরিক লিপার্ট দেখুন ।


3
@ এসএলাকস, যদি আমরা কল করি long == int, intসুস্পষ্টভাবে longডানে রূপান্তরিত ?
সেলমান জিনি

1
এবং হ্যাঁ, আমি আসলে এটি চেষ্টা না করে সমস্ত লিখেছিলাম।
স্ল্যাक्स

1
মনে রাখবেন, প্রশ্নের কোডে যদি কেউ পরিবর্তিত int age = 25;হয় const int age = 25;, তবে ফলাফলটি পরিবর্তিত হবে। এটা এ কারণে যে থেকে একটি অন্তর্নিহিত রূপান্তর হয় intকরার shortযে ক্ষেত্রে কোন অস্তিত্ব নেই। দেখুন অন্তর্নিহিত ধ্রুবক অভিব্যক্তি ধর্মান্তর
জেপ্প স্টিগ নীলসেন

2
@ এসএলাকস হ্যাঁ তবে আপনার উত্তরের "পাস করা মান" শব্দটি দু'ভাবেই ব্যাখ্যা করা যেতে পারে (বিকাশকারী কর্তৃক পাস করা মান হিসাবে, বা যে মানটি আসলে সিএলআর দ্বারা আনবক্সিংয়ের পরে পাস হয়েছিল)। আমি আনুষ্ঠানিক ব্যবহারকারীর অনুমান করছি যে ইতিমধ্যে উত্তরগুলি জানেন না তারা এখানে পূর্বের হিসাবে এটি পড়বে
জারেডপাড়

2
@ রাচেল: এটি সত্য না বাদে; ডিফল্ট == অপারেটর রেফারেন্স দ্বারা রেফারেন্স ধরনের তুলনা করা হয়। মান ধরণের এবং ওভারলোডের ধরণের ক্ষেত্রে ==এটি হয় না।
স্ল্যাक्स

55

নেই কারণ জন্য কোন জমিদার short.Equalsযে গ্রহণ করে int। সুতরাং, এটি বলা হয়:

public override bool Equals(object obj)
{
    return obj is short && this == (short)obj;
}

objএটি একটি short.. না, এটি মিথ্যা।


12

আপনি যখন পাস intকরার short'র সমান আপনি পাস object:

এখানে চিত্র বর্ণনা লিখুন সুতরাং এই সিউডোকোড চালায়:

return obj is short && this == (short)obj;


10

== একটি সমান শর্ত যাচাই করার জন্য ব্যবহৃত হয়, এটি অপারেটর হিসাবে বিবেচনা করা যেতে পারে (বুলিয়ান অপারেটর), কেবল 2 টি জিনিস তুলনা করার জন্য এবং এখানে ডেটা টাইপ কোনও ব্যাপার নয় কারণ সেখানে টাইপ কাস্টিং হবে এবং Equals এটি সমান শর্ত পরীক্ষার জন্যও ব্যবহৃত হয় , তবে এক্ষেত্রে ডেটা টাইপ একই রকম হওয়া উচিত। এন ইকুয়ালস এমন একটি পদ্ধতি যা অপারেটর নয়।

নীচে আপনি সরবরাহ করেছেন তার থেকে নেওয়া একটি ছোট উদাহরণ রয়েছে এবং এটি সংক্ষিপ্তভাবে পার্থক্য স্পষ্ট করবে,,

int x=1;
short y=1;
x==y;//true
y.Equals(x);//false

উপরের উদাহরণে, এক্স এবং ওয়াইয়ের সমান মান অর্থাৎ 1, এবং আমরা যখন ব্যবহার ==করব তখন এটি সত্য হিসাবে ফিরে আসবে case== সংক্ষিপ্ত টাইপটি সংকলক দ্বারা ইনট-এ রূপান্তরিত হয় এবং ফলাফল দেওয়া হয়।

এবং যখন আমরা ব্যবহার করি Equals, তুলনা করা শেষ হয়, তবে টাইপ castালাই সংকলক দ্বারা করা হয় না, তাই মিথ্যা ফিরিয়ে দেওয়া হয়।

বন্ধুরা, আমি ভুল হলে আমাকে জানাবেন।


6

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

তদ্ব্যতীত, প্রতিটি মানের ধরণ যেমন intবা shortআসলে এক ধরণের মান এবং এক ধরণের অবজেক্ট (*) উভয়ই বর্ণনা করে। অন্তর্ভুক্ত রূপান্তরগুলি মানগুলিকে অন্যান্য ধরণের মানগুলিতে রূপান্তর করতে এবং যে কোনও ধরণের মানকে তার সম্পর্কিত ধরণের অবজেক্টে রূপান্তর করতে উপস্থিত হয় তবে বিভিন্ন ধরণের অবজেক্টগুলি একে অপরের সাথে স্পষ্টত রূপান্তরিত হয় না।

যদি কেউ ==অপারেটরটিকে একটি shortএবং একটি তুলনা করতে ব্যবহার করে int, তবে shortতা স্পষ্টতই একটিতে রূপান্তরিত হবে int। যদি এর সাংখ্যিক মানটি এর সমান হয় int, তবে intএটি রূপান্তরিত হয়েছিল intতার সাথে এটির তুলনা করা সমান হবে । যদি কেউ শর্টে Equalsপদ্ধতিটির সাথে এটির তুলনা করার চেষ্টা করে intতবে, কেবলমাত্র একমাত্র অন্তর্নিহিত রূপান্তর যা Equalsপদ্ধতির একটি ওভারলোডকে সন্তুষ্ট করবে তা হ'ল সম্পর্কিত বস্তুর সাথে রূপান্তর int। যখন shortজিজ্ঞাসা করা হয় যে এটি পাস-ইন অবজেক্টটির সাথে মেলে কিনা, এটি পর্যবেক্ষণ করবে যে প্রশ্নে থাকা বস্তুটি একটি intনা হয়ে বরং shortএইভাবে সিদ্ধান্ত নেবে যে এটি সম্ভবত সমান হতে পারে না।

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

int i = 16777217;
float f = 16777216.0f;

Console.WriteLine("{0}", i==f);

তিনটি উপায় রয়েছে যার মাধ্যমে কেউ একটি এর intসাথে তুলনা করতে চাইতে পারে float। কেউ জানতে চাইতে পারেন:

  1. ম্যাচের সবচেয়ে নিকটতম floatমানটি কি intমিলবে float?
  2. floatম্যাচের পুরো সংখ্যাটি কি মিলছে int?
  3. একই সংখ্যার মানটি করুন intএবং floatউপস্থাপন করুন।

যদি কেউ একটি intএবং floatসরাসরি তুলনা করার চেষ্টা করে তবে সংকলিত কোডটি প্রথম প্রশ্নের উত্তর দেবে; তবে প্রোগ্রামারটি যা ইচ্ছা করেছিল তা সুস্পষ্ট থেকে দূরে থাকবে কিনা। তুলনা পরিবর্তন করা (float)i == fএটিকে পরিষ্কার করে দেবে যে প্রথম অর্থটি উদ্দেশ্য ছিল, বা(double)i == (double)f কোডটি তৃতীয় প্রশ্নের উত্তর দেবে (এবং এটি স্পষ্ট করে দেবে যা উদ্দেশ্য ছিল)।

(*) এমনকি সি # স্পেস যেমন ধরণের কোনও মানকে উদাহরণস্বরূপ System.Int32যেমন ধরণের একটি বস্তু হিসাবে বিবেচনা করে তবে এ System.Int32জাতীয় দৃষ্টিভঙ্গি এমন একটি প্রয়োজনীয়তার সাথে বৈপরীত্যযুক্ত যে কোনও প্ল্যাটফর্মের উপর একটি কোড চালানো হয় যার স্পেসটি বিভিন্ন মহাবিশ্বের বাসস্থান হিসাবে মান এবং বস্তুকে সম্মান করে। তদ্ব্যতীত, যদি Tকোনও রেফারেন্স টাইপ হয় এবং xএটি একটি হয় Tতবে প্রকারের একটি উল্লেখ উল্লেখ Tকরতে সক্ষম হওয়া উচিত x। সুতরাং, যদি কোনও vধরণের ভেরিয়েবল একটি Int32ধরে রাখে তবে Objectপ্রকারের Objectএকটি রেফারেন্স একটি রেফারেন্স vবা এর বিষয়বস্তু রাখতে সক্ষম হবে । প্রকৃতপক্ষে, প্রকারের একটি রেফারেন্স Objectঅনুলিপিযুক্ত অনুলিপিযুক্ত কোনও অবজেক্টের প্রতি নির্দেশ করতে সক্ষম হবে vতবে vনিজের বা তার সামগ্রীতে নয়। এটি যে সুপারিশ করবে নাvনা এর বিষয়বস্তু সত্যিই একটি Object


1
the only implicit conversion which would satisfy an overload of the Equals method would be the conversion to the object type corresponding to intভুল। জাভা থেকে আলাদা, সি # এর পৃথক আদিম এবং বাক্সযুক্ত ধরণের নেই। এটি বক্স করা হচ্ছে objectকারণ এটি কেবলমাত্র অন্যান্য ওভারলোড Equals()
স্ল্যাक्स

প্রথম এবং তৃতীয় প্রশ্ন অভিন্ন; রূপান্তর করার পরে সঠিক মানটি ইতিমধ্যে হারিয়ে গেছে float। একটি কাস্টিং floatএকটি থেকে doubleজাদুর নতুন স্পষ্টতা তৈরী করবে না।
স্ল্যাक्स

@ এসএলাক্স: ইসিএমএ অনুমান অনুসারে, ভার্চুয়াল মেশিনের বর্ণনা দেয় যা সি # চালায়, প্রতিটি মান ধরণের সংজ্ঞা দুটি স্বতন্ত্র প্রকার তৈরি করে। সি # স্পেক বলতে পারে যে স্টোরের স্টোরের অবস্থানের ধরণ List<String>.Enumeratorএবং ধরণের হিপ অবজেক্টের বিষয়বস্তু List<String>.Enumeratorএকই, তবে ইসিএমএ / সিএলআই স্পেক বলছে যে তারা আলাদা, এবং সি # তে ব্যবহৃত হলেও তারা আলাদা আচরণ করে।
সুপারক্যাট

@ এসএলাক্স: তুলনা করার আগে iএবং যদি fপ্রত্যেকে রূপান্তরিত হয় doubleতবে তারা 16777217.0 এবং 16777216.0 প্রদান করবে যা অসম হিসাবে তুলনা করে। রূপান্তরটি i float16777216.0f উপার্জন করবে, এর সাথে তুলনা করে f
সুপারক্যাট

@ এসএলাক্স: স্টোরেজ-লোকেশন টাইপ এবং বক্সড অবজেক্টের ধরণের মধ্যে পার্থক্যের একটি সহজ উদাহরণের জন্য, পদ্ধতিটি বিবেচনা করুন bool SelfSame<T>(T p) { return Object.ReferenceEquals((Object)p,(Object)p);}। একটি মান প্রকারের সাথে সম্পর্কিত বক্সযুক্ত অবজেক্টের ধরণটি কোনও ReferenceEqualsমাধ্যমে পরামিতি প্রকারটি সন্তুষ্ট করতে পারে পরিচয় সংরক্ষণের upCast; স্টোরেজ অবস্থানের ধরণের জন্য অবশ্য একটি অ-পরিচয়-সংরক্ষণের রূপান্তর দরকার। যদি একটি ভোটদান Tথেকে Uউৎপাদনের মূল চেয়ে অন্য কিছু একটি রেফারেন্স T, যে আমার কাছে সুপারিশ করবে যে একটি Tসত্যিই একটি হয় U
সুপারক্যাট

5

সমান () সিস্টেমের একটি পদ্ধতি b অবজেক্ট ক্লাস
সিনট্যাক্স: পাবলিক ভার্চুয়াল বুল সমান ()
প্রস্তাবনা যদি আমরা দুটি বস্তুর অবস্থার তুলনা করতে চাই তবে আমাদের সমান () পদ্ধতিটি ব্যবহার করা উচিত

উপরে বর্ণিত উত্তর হিসাবে == অপারেটরগুলি মানগুলির সাথে তুলনা করে।

দয়া করে রেফারেন্সএকুয়াল নিয়ে বিভ্রান্ত হবেন না

রেফারেন্স ইকুয়াল ()
সিনট্যাক্স: পাবলিক স্ট্যাটিক বুল রেফারেন্সএকোয়েলস ()
নির্দিষ্ট করা বস্তুগুলির উদাহরণ একই উদাহরণের কিনা তা নির্ধারণ করে


8
এটি প্রশ্নের কোনও উত্তর দেয় না।
স্ল্যাक्स

আমি যে উদাহরণস্বরূপ স্ল্যাक्सগুলি উদাহরণ দিয়ে ব্যাখ্যা করেছি এটি উপরের প্রশ্নের মৌলিক।
সুগাত মানকার 23'14

4

আপনার যা অনুধাবন করা দরকার তা হ'ল করায় ==সর্বদা কোনও পদ্ধতি কল করা শেষ হবে। কল করা ==এবং Equalsএকই জিনিসগুলি কল করা / করা শেষ কিনা তা প্রশ্ন ।

রেফারেন্সের ধরণের সাহায্যে, ==সর্বদা 1 ম রেফারেন্সগুলি একই ( Object.ReferenceEquals) কিনা তা যাচাই করা হবে । Equalsঅন্যদিকে ওভাররাইড করা যেতে পারে এবং কিছু মান সমান কিনা তা পরীক্ষা করতে পারে।

সম্পাদনা করুন: এসভিকের উত্তর দিতে এবং স্ল্যাक्स মন্তব্যে যোগ করতে এখানে কিছু আইএল কোড দেওয়া আছে

int i1 = 0x22; // ldc.i4.s ie pushes an int32 on the stack
int i2 = 0x33; // ldc.i4.s 
short s1 = 0x11; // ldc.i4.s (same as for int32)
short s2 = 0x22; // ldc.i4.s 

s1 == i1 // ceq
i1 == s1 // ceq
i1 == i2 // ceq
s1 == s2 // ceq
// no difference between int and short for those 4 cases,
// anyway the shorts are pushed as integers.

i1.Equals(i2) // calls System.Int32.Equals
s1.Equals(s2) // calls System.Int16.Equals
i1.Equals(s1) // calls System.Int32.Equals: s1 is considered as an integer
// - again it was pushed as such on the stack)
s1.Equals(i1) // boxes the int32 then calls System.Int16.Equals
// - int16 has 2 Equals methods: one for in16 and one for Object.
// Casting an int32 into an int16 is not safe, so the Object overload
// must be used instead.

তাহলে কোন পদ্ধতিটি দুটি intএসকে == কলের সাথে তুলনা করে ? ইঙ্গিত: এর জন্য কোনও operator ==পদ্ধতি নেই Int32তবে এর জন্য একটি পদ্ধতি রয়েছেString
সুইভ

2
এটি প্রশ্নের কোনও উত্তর দেয় না।
স্ল্যাक्स

@ এসএলাক্স: এটি প্রকৃতপক্ষে এবং সংক্ষিপ্ত তুলনা সম্পর্কে নির্দিষ্ট প্রশ্নের উত্তর দেয় না, আপনি ইতিমধ্যে এর উত্তর দিয়েছিলেন। আমি এখনও এটি আকর্ষণীয় বলে মনে করি যে ==এটি কেবল যাদু করে না, এটি অবশেষে কেবল একটি পদ্ধতি কল করে (বেশিরভাগ প্রোগ্রামার সম্ভবত কোনও অপারেটরকে কখনই প্রয়োগ / নিরীক্ষণ করে না)। হয়তো আমি আমার নিজের উত্তর যুক্ত করার পরিবর্তে আপনার প্রশ্নের একটি মন্তব্য যুক্ত করতে পারতাম। আমি যা বলেছি তা প্রাসঙ্গিক মনে হয় যদি আপনার আপডেট করতে নির্দ্বিধায় না হন।
ব্যবহারকারী 276648

নোট করুন যে ==আদিম ধরণের উপর একটি ওভারলোডেড অপারেটর নয়, তবে একটি অন্তর্নিহিত ভাষা বৈশিষ্ট্য যা ceqআইএল নির্দেশকে সংকলন করে ।
স্ল্যাक्स

3

== আদিম

Console.WriteLine(age == newAge);          // true

আদিম তুলনায় == অপারেটরটি বেশ সুস্পষ্ট আচরণ করে, সি # তে অনেকগুলি == অপারেটর ওভারলোড উপলব্ধ।

  • স্ট্রিং == স্ট্রিং
  • int == int
  • uint == uint
  • দীর্ঘ == দীর্ঘ
  • আরো অনেক

তাই এই ক্ষেত্রে সেখান থেকে কোন অন্তর্নিহিত রূপান্তর হয় intথেকে shortকিন্তু shortথেকে intসম্ভব। সুতরাং newAge ইনট মধ্যে রূপান্তরিত হয় এবং তুলনা ঘটে যা উভয় একই মান হিসাবে সত্য হিসাবে ফিরে আসে। সুতরাং এটি সমান:

Console.WriteLine(age == (int)newAge);          // true

.প্রকৃত ()

Console.WriteLine(newAge.Equals(age));         //false

এখানে আমাদের সমান () পদ্ধতিটি কী তা দেখতে হবে, আমরা সংক্ষিপ্ত ধরণের ভেরিয়েবলের সাথে সমানকে ডাকি। সুতরাং তিনটি সম্ভাবনা রয়েছে:

  • সমান (অবজেক্ট, অবজেক্ট) // অবজেক্ট থেকে স্ট্যাটিক পদ্ধতি
  • সমান (অবজেক্ট) // অবজেক্ট থেকে ভার্চুয়াল পদ্ধতি
  • সমান (সংক্ষিপ্ত) // কার্যকর আইকুয়েটেবল.একুয়ালস (সংক্ষিপ্ত)

প্রথম ধরণের এখানে মামলা হয় না কারণ আর্গুমেন্টের সংখ্যা পৃথক হয় কেবল টাইপ ইন্টের একটি মাত্র যুক্তি দিয়ে আমরা কল করি। তৃতীয়টিও উল্লেখ করা হয়েছে যে উপরে বর্ণিত সংক্ষিপ্ত রূপান্তরিত রূপান্তর সম্ভব নয় mentioned সুতরাং এখানে দ্বিতীয় ধরণের Equals(object)বলা হয়। short.Equals(object)হল:

bool Equals(object z)
{
  return z is short && (short)z == this;
}

সুতরাং এখানে শর্তটি পরীক্ষিত হয়ে গেছে z is shortযা z হিসাবে মিথ্যা, তাই এটি মিথ্যা প্রত্যাবর্তন করে।

এখানে এরিক লিপার্টের বিস্তারিত নিবন্ধটি দেওয়া আছে

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