سؤال

على الرغم من أن ربما بزار شيء تريد القيام به أنا بحاجة إلى إنشاء مجموعة في .صافي مع الأدنى > 0.هذا في البداية يبدو أن ممكن ، وذلك باستخدام:

Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});

وتنتج النتائج المرجوة (صفيف من الكائنات الأدنى تعيين 9).ومع ذلك إنشاء مجموعة سبيل المثال لا يمكن تمريرها إلى أساليب أخرى تتوقع Object[] يعطيني رسالة خطأ تقول أن:

System.Object[*] لا يمكن أن يلقي إلى System.Object[].ما هو هذا الاختلاف في أنواع مجموعة و كيف يمكنني التغلب على هذا ؟

تحرير:رمز اختبار =

Object x = Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});
Object[] y = (Object[])x;

الذي فشل مع:"غير قادر على تحويل كائن من النوع 'System.كائن[*]' إلى النوع 'System.كائن[]'."

وأود أيضا أن نلاحظ أن هذا النهج لا العمل عند استخدام عدة أبعاد:

Object x = Array.CreateInstance(typeof(Object), new int[] {2,2}, new int[] {9,9});
Object[,] y = (Object[,])x;

الذي يعمل بشكل جيد.

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

نصائح أخرى

السبب في أنك لا يمكن أن يلقي من واحدة إلى أخرى هو أن هذا هو الشر.

دعنا نقول لك إنشاء مجموعة من وجوه[5..9] و تمريرها إلى الدالة F ككائن[].

كيف وظيفة يعرف أن هذا هو 5..9 ?و يتوقع مجموعة العام لكنه الحصول على إعاقة واحدة.هل يمكن أن نقول أنه من الممكن أن أعرف, ولكن هذا لا يزال غير متوقعة و الناس لا تريد أن تجعل كل نوع من الشيكات الحدود في كل مرة أنها ترغب في استخدام بسيط الصفيف.

مجموعة هو أبسط هيكل في البرمجة ، مما يجعلها معقدة جدا يجعل unsusable.وربما كنت بحاجة إلى هيكل آخر.

ما تتمكن من فعل شئ هو الفئة التي هي مقيدة جمع يحاكي السلوك الذي تريده.بهذه الطريقة, كل مستخدمي هذا الدرس سوف نعرف ما يمكن توقعه.

class ConstrainedArray<T> : IEnumerable<T> where T : new()
{
    public ConstrainedArray(int min, int max)
    {
        array = new T[max - min];
    }

    public T this [int index]
    {
        get { return array[index - Min]; }
        set { array[index - Min] = value; }
    }

    public int Min {get; private set;}
    public int Max {get; private set;}

    T[] array;

    public IEnumerator<T> GetEnumerator()
    {
        return array.GetEnumarator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return array.GetEnumarator();
    }

}

أنا لست متأكدا لماذا لا يمكن أن تكون مرت وجوه [] ، لكن لن يكون من السهل إذا كنت مجرد إنشاء فئة حقيقية التفاف مجموعة والتعامل مع الخاص بك "غريب المنطق" هناك ؟

سوف تحصل على فوائد استخدام مرجعية حقيقية كائن كنت يمكن أن تضيف "المخابرات" إلى صفك.

تحرير:كيف حالك صب الصفيف الخاص بك, يمكنك إضافة بعض مزيد من الكود ؟ شكرا

مجرد مخزن الخاص بك الأدنى في const تعويض صحيح ، و طرح هذه القيمة من أي مصدر عوائد المؤشر.

أيضا:هذا هو قديم VB6 الميزة.أعتقد أنه قد يكون هناك سمة للمساعدة في دعم ذلك.

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