এমএসডিএন-তে==
অপারেটরের ডকুমেন্টেশন অনুসারে ,
পূর্বনির্ধারিত মান ধরণের জন্য, সমতা অপারেটর (==) যদি তার অপারেন্ডগুলির মান সমান হয়, অন্যথায় মিথ্যা হয় তবে সত্যটি প্রত্যাবর্তন করে। স্ট্রিং ব্যতীত রেফারেন্সের ধরণের জন্য, এর দুটি অপারেন্ড একই অবজেক্টকে উল্লেখ করে তবে == সত্য ফিরে আসে। স্ট্রিং প্রকারের জন্য, == স্ট্রিংয়ের মানগুলির সাথে তুলনা করে। ব্যবহারকারী-সংজ্ঞায়িত মানের ধরণগুলি == অপারেটরটি (অপারেটরটি দেখুন) ওভারলোড করতে পারে। ব্যবহারকারী-সংজ্ঞায়িত রেফারেন্স প্রকারগুলিও পারেন, যদিও পূর্বনির্ধারিত এবং ব্যবহারকারী-সংজ্ঞায়িত উভয় প্রকারের ক্ষেত্রেই পূর্বনির্ধারিত == উপরে বর্ণিত হিসাবে আচরণ করে।
তাহলে এই কোড স্নিপেট সংকলন করতে ব্যর্থ হয় কেন?
bool Compare<T>(T x, T y) { return x == y; }
আমি ত্রুটি পেয়েছি অপারেটর '==' 'টি' এবং 'টি' টাইপের অপারেন্ডগুলিতে প্রয়োগ করা যাবে না । আমি ভাবছি কেন, যেহেতু আমি বুঝতে পারি ==
অপারেটরটি সমস্ত প্রকারের জন্য পূর্বনির্ধারিত?
সম্পাদনা: ধন্যবাদ, সবাই। আমি প্রথমে লক্ষ্য করিনি যে বিবৃতিটি কেবল রেফারেন্সের ধরণের ছিল। আমি আরও ভেবেছিলাম যে বিট-বাই-বিট তুলনাটি সমস্ত মানের ধরণের জন্য সরবরাহ করা হয়, যা আমি জানি এখন সঠিক নয় ।
তবে, আমি যদি কোনও রেফারেন্স টাইপ ব্যবহার করছি, ==
অপারেটরটি কি পূর্বনির্ধারিত রেফারেন্স তুলনা ব্যবহার করবে, বা কোনও টাইপ সংজ্ঞায়িত হলে অপারেটরের ওভারলোডেড সংস্করণটি ব্যবহার করবে?
সম্পাদনা 2: ট্রায়াল এবং ত্রুটির মাধ্যমে, আমরা শিখেছি যে ==
অপারেটর একটি সীমাহীন জেনেরিক টাইপ ব্যবহার করার সময় পূর্বনির্ধারিত রেফারেন্স তুলনা ব্যবহার করবে। প্রকৃতপক্ষে, সংকলকটি সীমাবদ্ধ ধরণের আর্গুমেন্টের জন্য এটি খুঁজে পেতে পারে এমন সর্বোত্তম পদ্ধতিটি ব্যবহার করবে তবে এটি আর দেখবে না। উদাহরণস্বরূপ, নীচের কোডটি সর্বদা মুদ্রণ করবে true
, এমনকি যখন Test.test<B>(new B(), new B())
বলা হয়:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
একই ধরণের দুটি অপারেন্ডের মধ্যে অনুমোদিত নয় the এটি struct
প্রকারের জন্য সত্য ("পূর্বনির্ধারিত" প্রকারগুলি ব্যতীত) যা ওভারলোড করে না operator ==
। একটি সাধারণ উদাহরণ হিসাবে, এটি ব্যবহার করে দেখুন:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, তবে আপনি চেক করতে পারবেন না kvp1 == kvp2
কারণ KeyValuePair<,>
এটি কাঠামো, এটি কোনও সি # পূর্বনির্ধারিত টাইপ নয় এবং এটি ওভারলোডও করে না operator ==
। তবুও একটি উদাহরণ দেওয়া হয়েছে var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
যার সাহায্যে আপনি না করতে পারেন e1 == e2
(এখানে আমাদের নেস্টেড স্ট্রাক্ট রয়েছে List<>.Enumerator
( "List`1+Enumerator[T]"
রানটাইম দ্বারা ডাকা ) যা ওভারলোড না করে ==
)।
bool
থেকে ফিরে আসতে পারবেন না void
...