كيفية حل الدعوة الغموض بين عامة.IList<T>.هذا[] و IList.هذا[]?

StackOverflow https://stackoverflow.com/questions/57054

سؤال

لدي المجموعة التي تنفذ واجهة التي يمتد كل IList<T> و قائمة.

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

وهذا يعني لدي نسختين من الفهرس.

أتمنى العامة للتنفيذ ليتم استخدامها لذا تنفيذ هذا واحد عادة:

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

أنا فقط بحاجة IList نسخة التسلسل لذا تنفيذ ذلك صراحة ، إخفاءها:

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

ومع ذلك ، في وحدة الاختبارات التالية

MyObject foo = target[0];

النتائج في خطأ التحويل

نداء غامض بين الطرق التالية أو خصائص

أنا مندهش قليلا في هذا ؛ أعتقد أنني قد فعلت ذلك من قبل و أنه يعمل بشكل جيد.ما أنا في عداد المفقودين هنا ؟ كيف يمكنني الحصول على IList<T> و IList أن تتعايش في نفس الواجهة ؟

تحرير IList<T> لا لا تنفيذ IList وأنا يجب أن تنفيذ IList عن التسلسل.أنا غير مهتم في الحلول ، أريد أن أعرف ما أنا في عداد المفقودين.

تحرير مرة أخرى:لقد كان إسقاط IList من واجهة ونقله في صفي.أنا لا أريد أن أفعل هذا ، الطبقات التي تنفذ واجهة تسير في نهاية المطاف أن يكون تسلسل إلى Xaml ، الأمر الذي يتطلب مجموعات لتنفيذ يقع أو IList...

هل كانت مفيدة؟

المحلول

لا يمكنك أن تفعل هذا مع

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

ولكن يمكنك أن تفعل ما تريد مع فئة, سوف تحتاج إلى جعل تطبيقات واحدة من واجهات صريحة.في بلدي على سبيل المثال أنا جعلت IList صريحة.

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

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

هل تعتبر وجود IMySpecialCollection تنفيذ ISerializable عن التسلسل?دعم متعددة جمع أنواع يبدو الخطأ قليلا بالنسبة لي.قد تحتاج أيضا إلى النظر في صب يووت IList إلى IEnumerable عن التسلسل منذ IList فقط يلتف IEnumerable ICollection.

نصائح أخرى

هذا هو مغفل من سؤالي هنا

لتلخيص, إذا كنت تفعل هذا, فإنه لا يحل المشكلة:

public Interface IMySpecialCollection : IList<MyObject>, IList
{
    new MyObject this[int index];
    ... 
}

للأسف لا يمكنك أن تعلن اثنين والمفهرسات مع نفس المعلمة القائمة.الفقرة التالية من هنا C# البرمجة دليل استخدام والمفهرسات "ملاحظات" القسم:

التوقيع غير مفهرس يتكون من عدد وأنواع من المعلمات رسمية.ولكنها لا تشمل المفهرس نوع أو أسماء المعلمات رسمية.إذا كنت تعلن أكثر من واحد مفهرس في نفس الفئة ، يجب أن يكون توقيعات مختلفة.

سيكون لديك تعلن مجموعة مختلفة من المعلمات إذا كنت ترغب في استخدام الثانية مفهرس.

تغيير إعدادات عامة التنفيذ...

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

هذا صراحة الذي يقول 'هذا' هو الذي.

قائمة<T> يعني IList, حتى انها فكرة سيئة أن تستخدم على حد سواء في نفس الفئة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top