2012-08-07 14 views
20

सी # भाषा विशिष्टता संस्करण 4 में, 1.6.7.5 ऑपरेटरों List<T> ऑपरेटरों के बारे में जानकारी है: == और !=। लेकिन मुझे ऐसे ऑपरेटरों को List<T> में परिभाषित नहीं किया जा सकता है? क्या मैं कुछ भूल रहा हूँ? 1.6.7.5 ऑपरेटरों सेसूची <T> ऑपरेटर == सी # भाषा विशिष्टता संस्करण 4

नमूना कोड:

List<int> a = new List<int>(); 
a.Add(1); 
a.Add(2); 
List<int> b = new List<int>(); 
b.Add(1); 
b.Add(2); 
Console.WriteLine(a == b); // Outputs "True" => here I get False as well 
b.Add(3); 
Console.WriteLine(a == b); // Outputs "False" 
+0

अधिक स्पष्ट रूप से – darnir

+5

अपने प्रश्न की व्याख्या करें कृपया कहते हैं नहीं "आउटपुट" "मैं यह चाहते हैं .." के लिए :) –

+8

@pst इस कोड को कॉपी किया जाता है और भाषा कल्पना से शब्दशः चिपकाया, के साथ साथ टिप्पणी। – dasblinkenlight

उत्तर

17

कल्पना वास्तव में सही है, हालांकि भ्रमित है। कल्पना सूची (खराब नामकरण पसंद) नामक एक वर्ग को परिभाषित करती है।

निम्न तालिका सूची नामक एक सामान्य वर्ग दिखाती है, जो वस्तुओं की एक बढ़ती सूची लागू करती है। कक्षा में सबसे आम प्रकार के फ़ंक्शन सदस्यों के कई उदाहरण शामिल हैं।

यह कक्षा धारा 1.6.7 पर spec में देखी जा सकती है। बराबर ऑपरेटर ओवरलोड किया गया है और ऊपर बताए गए आउटपुट से मेल खाता है। शायद उस वर्ग के लिए एक बेहतर नाम चुना जाना चाहिए था।

static bool Equals(List<T> a, List<T> b) { 
    if (a == null) return b == null; 
    if (b == null || a.count != b.count) return false; 
    for (int i = 0; i < a.count; i++) { 
     if (!object.Equals(a.items[i], b.items[i])) { 
      return false; 
     } 
    } 
    return true; 
} 
21

List<T> एक संदर्भ प्रकार है जो operator== ओवरलोड नहीं करता है। इसलिए, यह डिफ़ॉल्ट संदर्भ समानता semantics का उपयोग करता है। आप इंप्रेशन के तहत प्रतीत होते हैं कि यह मूल्य semantics प्रदान करने के लिए operator== ओवरराइड करता है, लेकिन ऐसा नहीं करता है। ab के बराबर होगा जब a और b दोनों एक ही List<T> उदाहरण देखें।

संपादित करें: इसलिए मैंने खुद को कल्पना देखा। यह कहता है:

सूची वर्ग दो ऑपरेटरों, ऑपरेटर == और ऑपरेटर! = की घोषणा करता है, और इस प्रकार उन अभिव्यक्तियों को नया अर्थ देता है जो उन ऑपरेटरों को सूची उदाहरणों पर लागू करते हैं। विशेष रूप से, ऑपरेटर दो समान उदाहरणों की समानता को परिभाषित करते हैं क्योंकि प्रत्येक समान विधियों का उपयोग करके उनकी निहित वस्तुओं की तुलना करते हैं। निम्नलिखित उदाहरण दो सूची उदाहरणों की तुलना करने के लिए == ऑपरेटर का उपयोग करता है।

ईमानदारी से ... मेरे पास कोई सुराग नहीं है कि वे किस बारे में बात कर रहे हैं, लेकिन यह सही नहीं लगता है। जहां तक ​​मैं कुछ परीक्षण चलाने के बाद बता सकता हूं List<T> कक्षा संदर्भ समानता का उपयोग करती है। अच्छा प्रश्न।

EDIT2: List<T>, operator== और/या operator!= ओवरलोड का संकुचित। इस मामले में यह कल्पना पूरी तरह गलत है।

+1

भाषा कल्पना अन्यथा कहते हैं:। "सूची वर्ग दो ऑपरेटरों, ऑपरेटर == और ऑपरेटर = वाणी, और इस तरह भाव है कि उन ऑपरेटरों उदाहरणों सूची में लागू करने के लिए नया अर्थ देता है विशेष रूप से, ऑपरेटरों को परिभाषित दो सूची उदाहरणों की समानता प्रत्येक समान विधियों का उपयोग करके निहित वस्तुओं में से प्रत्येक की तुलना करना। " – dasblinkenlight

+0

@dasblinkenlight: आप सही हैं, मैं इसे अभी पढ़ रहा हूं। इसे समझने की कोशिश कर रहे हैं ... –

+0

@DanielDusek: हाँ, मैंने अभी अपनी पोस्ट में यह जोड़ा है। यह गलत प्रतीत होता है। वास्तविकता कल्पना के अनुरूप नहीं है। –

संबंधित मुद्दे