هل هناك طريقة معقولة لمعلمات النوع "الافتراضي" في C# Generics؟

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

سؤال

في قوالب C++، يمكن تحديد أن معلمة نوع معينة هي المعلمة الافتراضية.أي.ما لم يتم تحديد ذلك صراحةً، فإنه سيستخدم النوع T.

هل يمكن القيام بذلك أو تقريبه في C#؟

أنا أبحث عن شيء مثل:

public class MyTemplate<T1, T2=string> {}

بحيث لا يتم تحديد مثيل من النوع بشكل صريح T2:

MyTemplate<int> t = new MyTemplate<int>();

سيكون في الأساس:

MyTemplate<int, string> t = new MyTemplate<int, string>();

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

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

المحلول

وشاء subclasses ترث هو الخيار الأفضل.

وأود أن فئة فرعية الفئة العامة الرئيسية الخاصة بك:

وclass BaseGeneric<T,U>

ومع فئة معينة

وclass MyGeneric<T> : BaseGeneric<T, string>

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

نصائح أخرى

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

public class MyTemplate<T1,T2>
{
     public MyTemplate(..args..) { ... } // constructor
}

public static class MyTemplate{

     public static MyTemplate<T1,T2> Create<T1,T2>(..args..)
     {
         return new MyTemplate<T1, T2>(... params ...);
     }

     public static MyTemplate<T1, string> Create<T1>(...args...)
     {
         return new MyTemplate<T1, string>(... params ...);
     }
}

var val1 = MyTemplate.Create<int,decimal>();
var val2 = MyTemplate.Create<int>();

في المثال أعلاه val2 هو من النوع MyTemplate<int,string> و لا نوع مشتق منه.

نوع class MyStringTemplate<T>:MyTemplate<T,string> ليس من نفس النوع MyTemplate<T,string>.قد يشكل هذا بعض المشاكل في سيناريوهات معينة.على سبيل المثال، لا يمكنك إرسال مثيل لـ MyTemplate<T,string> ل MyStringTemplate<T>.

ويمكنك أيضا إنشاء الزائد الدرجة مثل ذلك

public class MyTemplate<T1, T2> {
    public T1 Prop1 { get; set; }
    public T2 Prop2 { get; set; }
}

public class MyTemplate<T1> : MyTemplate<T1, string>{}

ولا يدعم C # مثل هذه الميزة.

وكما قال لك، يمكنك فئة فرعية أنه (إذا لم يكن مختومة، وتكرار كل الإعلانات منشئ) ولكن هذا شيء مختلف تماما.

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

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