الكتابة الضمنية للمصفوفات التي تنفذ واجهات

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

  •  04-10-2019
  •  | 
  •  

سؤال

كنت تحت الانطباع بأن برنامج التحويل البرمجي C# سوف يكتب ضمنيًا صفيفًا يستند إلى نوع يمكن تحويله إلى ضمنيًا.

المترجم يولدلا يوجد أفضل نوع موجود لمجموعة ضمنية من النوع

public interface ISomething {}

public interface ISomething2 {}

public interface ISomething3 {}

public class Foo : ISomething { }
public class Bar : ISomething, ISomething2 { }
public class Car : ISomething, ISomething3 { }

void Main()
{
    var obj1 = new Foo();
    var obj2 = new Bar();
    var obj3 = new Car();

    var objects= new [] { obj1, obj2, obj3 };
}

أعلم أن الطريقة لتصحيح هذا هي إعلان النوع مثل:

new ISomething [] { obj1, ...} 

لكنني بعد مساعدة نوع الأغطية هنا.

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

المحلول

ينظر برنامج التحويل البرمجي C# في مجموعة أنواع جميع العناصر المحددة. نعم هو كذلك ليس النظر في أنواع القاعدة الشائعة وما إلى ذلك

أنت استطاع يلقي أحد التعبيرات:

var objects= new [] { obj1, obj2, (ISomething) obj3 };

... لكن شخصياً سأستخدم النموذج الصريح:

var objects= new ISomething[] { obj1, obj2, obj3 };

بدلاً من ذلك ، إذا أعلنت صراحة أي أو كل obj1, obj2 و obj3 كنوع ISomething, ، من شأنه أن يعمل بشكل جيد أيضًا دون تغيير تعبير تهيئة الصفيف.

من المواصفات C# 3 ، القسم 7.5.10.4:

يشار إلى تعبير إنشاء صفيف للنموذج الثالث باسم تعبير خلق صفيف مكتوب ضمنيًا. إنه مشابه للنموذج الثاني ، باستثناء أن نوع العنصر من الصفيف لا يتم إعطاؤه صراحة ، ولكن تم تحديده على أنه أفضل نوع شائع (§7.4.2.13) لمجموعة التعبيرات في مصفوفة الصفيف.

القسم 7.4.2.13 يبدو هكذا:

في بعض الحالات ، يجب استنتاج النوع المشترك لمجموعة من التعبيرات. على وجه الخصوص ، تم العثور على أنواع العناصر من المصفوفات المكتوبة ضمنيًا وأنواع الإرجاع للوظائف المجهولة مع أجسام الكتلة بهذه الطريقة. بشكل حدسي ، بالنظر إلى مجموعة من التعبيرات e1 ... em يجب أن يكون هذا الاستدلال مكافئًا لاستدعاء طريقة

Tr M<X>(X x1 … X xm)

مع EI كحجيلات. بتعبير أدق ، يبدأ الاستدلال بمتغير نوع غير مثبت X. يتم إجراء استنتاجات نوع الإخراج من كل EI مع النوع X. أخيرًا ، يتم إصلاح x والنوع الناتج S هو النوع الشائع الناتج عن التعبيرات.

نصائح أخرى

إذا كان من الممكن إلقاء جميع الحالات على نوع أي مثيل واحد ، فسيتم استخدام هذا النوع. لا يكفي لجميع الحالات أن يكون لها أي نوع مشترك ، وإلا فإن تهيئة صفيف الضمني ستنجح دائمًا وغالبًا ما تولد غير مرغوب فيها new object[] المصفوفات.

كإضافة بسيطة إلى رد السكيت:

يمكنك إما إلقاء أحد عناصر الصفيف إلى النوع الذي تحتاجه (واجهة في هذه الحالة) أو إذا كان لديك عنصر واحد فقط من هذا النوع (ليس مستمدًا ولكن من نوع مباشر). مثل

public static IWindsorInstaller[] MobileRestComponentInstallers
        {
            get
            {
                return new []
                           {
                                 new RepositoryInstaller(),
                                 new AppSettingsInstaller(),
                                 // tens of other installers...
                                 GetLoggerInstaller() // public IWindsorInstaller GetLoggerInstaller()...
                           };
            }
        }

سيعمل هذا ، لكن الثابتة والمتنقلة لا تفعل ذلك :) فقط حدد نوع الصفيف وتغيير new[] إلى new IWindsorinstaller[]. إنه أكثر قابلية للقراءة بعد تعريف نوع المصفوفة بشكل صريح.

Do like this for Class object( UIViewController) initialization in var array:



 var page1 = new Class1();
 var page2 = new Class2();
 var pages = new UIViewController[] { page1, page2 };

ملاحظة: هنا يمكن أن يكون UiviewController أي فصل

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