2008-09-11 4 views
7

मेरे पास एक संग्रह है जो एक इंटरफ़ेस लागू करता है जो IList < टी> और सूची दोनों को बढ़ाता है।Generic.IList <T> के बीच कॉल अस्पष्टता को हल करने के लिए कैसे करें। यह [] और IList.this []?

public Interface IMySpecialCollection : IList<MyObject>, IList { ... } 

इसका मतलब है कि मेरे पास सूचकांक के दो संस्करण हैं।

काश सामान्य कार्यान्वयन प्रयोग की जाने वाली है, इसलिए मुझे लगता है कि एक सामान्य रूप से लागू:

public MyObject this[int index] { .... } 

मैं केवल क्रमबद्धता के लिए IList संस्करण की आवश्यकता है, तो मैं यह स्पष्ट रूप से लागू है, यह छिपा रखने के लिए:

object IList.this[int index] { ... } 

लेकिन, मेरा इकाई परीक्षण में, निम्नलिखित एक कॉम में

MyObject foo = target[0]; 

परिणाम piler त्रुटि

कॉल निम्न विधियों या गुण

मैं थोड़ा इस पर हैरान हूँ के बीच अस्पष्ट है; मुझे विश्वास है कि मैंने इसे पहले किया है और यह ठीक काम करता है। मुझे यहां क्या समझ नहीं आ रहा है? मैं आईएलआईस्ट < टी> और एक ही इंटरफ़ेस के भीतर सहयोग करने के लिए IList कैसे प्राप्त कर सकता हूं?

संपादित IList < टी>नहीं लागू IList करता है, और मैं क्रमबद्धता के लिए IList को लागू करना चाहिए। मुझे कामकाज में दिलचस्पी नहीं है, मैं जानना चाहता हूं कि मैं क्या खो रहा हूं।

फिर से संपादित करें: मुझे आईएलिस्ट को इंटरफ़ेस से छोड़ना पड़ा और इसे मेरी कक्षा में ले जाना पड़ा। मैं ऐसा नहीं करना चाहता, क्योंकि इंटरफ़ेस को कार्यान्वित करने वाले वर्गों को अंततः Xaml पर क्रमबद्ध किया जा रहा है, जिसके लिए आईडीकेर या IList को लागू करने के लिए संग्रह की आवश्यकता है ...

+0

मैं पूछ सकता है कि कैसे आप एक कस्टम इंडेक्सर serializing कर रहे हैं? जब मैंने कस्टम इंडेक्सर (डब्ल्यूसीएफ के लिए) को इंडेक्स करने की कोशिश की है, तो मुझे एएसपी पीले-स्क्रीन-ऑफ-डेथ संदेश मिलता है जिसमें कहा गया है कि कस्टम इंडेक्सर्स को क्रमबद्ध नहीं किया जा सकता है। अंततः मैंने इस विचार को छोड़ दिया। –

उत्तर

3

आप

public interface IMySpecialCollection : IList<MyObject>, IList { ... }

साथ ऐसा नहीं कर सकते लेकिन तुम क्या आप एक वर्ग के साथ चाहते हैं, आप इंटरफेस स्पष्ट में से एक के लिए कार्यान्वयन करने की आवश्यकता होगी कर सकते हैं। मेरे उदाहरण में मैंने स्पष्ट रूप से IList बनाया।

public class MySpecialCollection : IList<MyObject>, IList { ... }

IList<object> myspecialcollection = new MySpecialCollection(); IList list = (IList)myspecialcollection;

आप IMySpecialCollection क्रमबद्धता के लिए लागू ISerializable होने पर विचार किया है? एकाधिक संग्रह प्रकारों का समर्थन करना मेरे लिए थोड़ा गलत लगता है। आप आईरिस्ट को आईरियंटेबल को सीरियलाइजेशन के लिए कास्ट करना चाहते हैं क्योंकि आईलीस्ट सिर्फ आईनेमेरेबल और आईसीओलेक्शन को लपेटता है।

+1

+1 यह ध्यान देने के लिए कि यह त्रुटि तब होती है जब इंटरफ़ेस का उपयोग करते समय कक्षा नहीं होती है। Iserializable + Xaml के लिए 0: पी – Lucas

-1

सूची < टी> आईएलआईटी का तात्पर्य है, इसलिए यह एक बुरा है एक ही कक्षा में दोनों का उपयोग करने का विचार।

+1

IList IList लागू नहीं करता है। और मुझे क्रमिक उद्देश्यों के लिए IList को लागू करने की आवश्यकता है। – Will

1

दुर्भाग्यवश आप एक ही पैरामीटर सूची के साथ दो इंडेक्सर्स घोषित नहीं कर सकते हैं। निम्नलिखित पैराग्राफ यहां से लिया गया है C# Programming Guide - Using Indexers "Remarks" section:

इंडेक्सर के हस्ताक्षर में इसके औपचारिक मानकों की संख्या और प्रकार शामिल हैं। इसमें इंडेक्सर प्रकार या औपचारिक पैरामीटर के नाम शामिल नहीं हैं। यदि आप एक ही कक्षा में एक से अधिक इंडेक्सर घोषित करते हैं, तो उनके पास अलग-अलग हस्ताक्षर होना चाहिए।

यदि आप दूसरे इंडेक्सर का उपयोग करना चाहते हैं तो आपको पैरामीटर का एक अलग सेट घोषित करना होगा।

+1

आपके पास 2 इंडेक्सर्स 'यह' नहीं हो सकते हैं, लेकिन आपके पास 'स्ट्रिंग IDataErrorInfo.this' और 'टी IList । यह' हो सकता है। इंडेक्सर तक पहुंचने से पहले आपको ऑब्जेक्ट डालना होगा, लेकिन यह काम करता है। –

-1

अपने सामान्य कार्यान्वयन में बदलें ...

T IList<T>.this[int index] { get; set; } 

यह स्पष्ट रूप से कहते हैं जो 'इस' जो है।

+0

दोनों स्पष्ट रूप से कार्यान्वित किए गए हैं, आपको किसी एक का उपयोग करने के लिए सूची डालना होगा, जो वह नहीं चाहता है। वह सामान्य व्यक्ति को डिफ़ॉल्ट करना चाहता है और गैर-जेनेरिक को छुपाता है। – Lucas

2

यह my question here

के शिकार संक्षेप में प्रस्तुत करना है अगर आप ऐसा करते हैं, तो यह समस्या हल:

public Interface IMySpecialCollection : IList<MyObject>, IList 
{ 
    new MyObject this[int index]; 
    ... 
} 
संबंधित मुद्दे