.صافي لماذا يمكن string[] تكون مرت كما IEnumerable<string> المعلمة ؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

هذا هو رمز صالح:

void func(IEnumerable<string> strings){
    foreach(string s in strings){
        Console.WriteLine(s);
    }
}

string[] ss = new string[]{"asdf", "fdsa"};
func(ss);

ما أريد أن أعرفه هو كيف يمكن التحويل الضمني string[] -> IEnumerable<string> العمل ؟

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

المحلول

من: msdn فئة مجموعة

في .NET Framework الإصدار 2.0 ، مجموعة الدرجة تنفذ

  • IList<T>,
  • ICollection<T>, ،
  • IEnumerable<T>

واجهات عامة.التطبيقات هي المقدمة المصفوفات في وقت التشغيل, وبالتالي هي غير مرئية إلى وثائق أدوات البناء.ونتيجة لذلك ، فإن واجهات عامة لا تظهر في إعلان الجملة من أجل مجموعة الصف ، وليس هناك أي إشارة مواضيع واجهة الأعضاء التي يمكن الوصول إليها فقط من قبل الصب مجموعة إلى عامة واجهة نوع (صريحة واجهة تطبيقات).أهم شيء أن تكون على علم عندما يلقي مجموعة واحدة من هذه الواجهات هو أن أعضاء أي إضافة أو إدراج أو إزالة عناصر رمي NotSupportedException.

نصائح أخرى

والطبقة Array، وهو وحش غريب جدا ومعاملة خاصة جدا من قبل المجمع وJIT (أكثر على أن في الكتب ريختر ودون بوكس، وأعتقد)، تنفذ IEnumerable<T>.

وصالحة تنفيذ IEnumerable ذلك لأي T [] هناك تحويل لIEnumerable .

كيف التحويل الضمني string[] -> IEnumerable العمل ؟

هذا النوع من يخطئ ، لا يوجد تحويل. المصفوفات تنفيذ (هل يمكن القول تقريبا "يرث" ، إذا كان هذا الأمر أكثر منطقية بالنسبة لك) IEnumerable ، وهكذا سلسلة[] بالفعل هو وهو IEnumerable — لا يوجد تحويل

هذا هو معيار واجهة التحويل ؛ كما شرط ، المصفوفات (T[]) تنفيذ IEnumerable و IEnumerable<T>.لذلك string[] هو 100 ٪ متوافق مع IEnumerable<T>.تنفيذ يتم توفيرها من قبل برنامج التحويل البرمجي (المصفوفات كانت أساسا عامة من قبل .صافي الأدوية موجودة).

من المواصفات (ECMA 334 v4) - هذا هو نتيجة 13.1.4:

  • من صفيف أحادي الأبعاد من نوع S[] إلى System.Collections.Generic.IList<S> و قاعدة واجهات من هذه الواجهة.
  • من صفيف أحادي الأبعاد من نوع S[] إلى System.Collections.Generic.IList<T> وقاعدة واجهات من هذه الواجهة ، شريطة أن يكون هناك إشارة ضمنية التحويل من S إلى T.

و يذكر أن IList<T> : IEnumerable<T>

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