لماذا تقوم المصفوفات في .NET فقط بتنفيذ iEnumerable وليس ienumerform ؟
-
03-10-2019 - |
سؤال
كنت أقوم بتطبيق فصل ArrayList الخاص بي وتركت مندهشًا عندما أدركت ذلك
public System.Collections.Generic.IEnumerator<T> GetEnumerator() {
return _array.GetEnumerator();
}
لم ينجح. ما هو سبب عدم تنفيذ المصفوفات في .NET؟
هل هناك أي عمل في الأرجاء؟
شكرًا
المحلول
المصفوفات تنفذ IEnumerable<T>
, ، ولكن يتم ذلك كجزء من المعرفة الخاصة التي يمتلكها CLI للمصفوفات. يعمل هذا كما لو كان تطبيقًا صريحًا (ولكن ليس: يتم ذلك في وقت التشغيل). لن تظهر العديد من الأدوات هذا التنفيذ ، وهذا ما هو موضح في ملاحظات قسم من Array
نظرة عامة على الفصل.
يمكنك إضافة طاقم:
return ((IEnumerable<T>)_array).GetEnumerator();
ملاحظة ، تم تغيير تغطية MSDN الأقدم (docs.microsoft.com) لهذا الأمر عدة مرات مع إصدارات .NET مختلفة ، تحقق من ملاحظات الجزء.
نصائح أخرى
يمكنك استخدام طريقة عامة IEnumerable<T> OfType<T>()
من مساحة الاسم System.linq ، والتي تمتد واجهة iEnumerable. سوف يقوم بتصفية جميع العناصر التي يختلف النوع عن T والعودة IEnumerable<T> collection
. كما ترى (IEnumerable<T>)_array
مشغل التحويل ، قد لا يكون آمنًا ، لأنه System.Array
(وغيرها من أنواع nongeneric) تخزين عناصر من النوع System.Object
.