سؤال

ولقد اثنين من الطبقات .... الطرود وFundParcel ... وأنا أحاول أن تحويل IEnumerable من النوع الفرعي إلى IList من supertype ....

public class FundParcel : Parcel
{
  /* properties defined here */
}

public class Parcel
{
  /* properties defined here */
}
تستخدم

وهذه في فئة أخرى في الأسلوب كما يلي:

private IList<Parcel> ExtractParcels(IEnumerable<FundParcel> fundParcels)
{
    var parcels = new List<Parcel>();

    foreach (var fp in fundParcels)
        parcels.Add(fp);

    return parcels;
}

وماذا أنا لا افهم لماذا بيان foreach لا يمكن تخفيضها إلى:

parcels.AddRange(fundParcels);

وأنا أساسا الحصول على خطأ تقول "نوع حجة 'System.Colection.Generic.IEnumerable<FundParcel>' is not assignable to parameter type 'System.Collections.Generic.IEnumerable<Parcel>'"

ولكن إذا كان هذا هو الحال بعد ذلك أنا لا أفهم لماذا يعمل parcels.Add ...

وأشعر كما لو يتعين على طريقة بأكمله لتكون قابلة للاستبدال مع السطر:

return (List<Parcel>)fundParcels;

... أو ربما طريقة يمكن الغاء alltogether منذ فرعية ينبغي أن يكون للاستبدال لsupertype بهم ..

ويمكن لأي شخص أن يشرح ما هي الصفقة مع AddRange في هذه الحالة وماذا عن حلقة قد يكون من الضروري في هذه الحالة؟

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

المحلول

هذه الإرادة SO ربما الإجابة على سؤالك، وكذلك سوف نشير لك إشارات حول المقبلة C # 4.0 التي ستدعم المشارك / كونترا التباين إلى درجة معينة.

نصائح أخرى

والنظر في هذا الرمز:

void AddParcelToParcelList(List<Parcel> parcels) {
  parcels.add(new Parcel());
}

List<FundParcel> fundParcels = new List<FundParcels>();
AddParcelToParcelList(fundParcels);

إذا حاويات من الطبقات الموروثة ورثت أيضا من الحاويات من الفئات الأساسية، رمز أعلاه سيكون ساري المفعول، وتولد حالة حيث قائمة من فئة موروثة يحتوي على كائن من الفئة الأساسية.

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