نوع عام نولابل المستخدمة مع إيكومبال.هل من الممكن?

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

سؤال

أحاول إنشاء مشبك بسيط (حتى أتمكن من ربط قيم أي شيء مماثل ...في الغالب لأنواع الأرقام مثل كثافة العمليات ، مزدوجة ، إلخ.)

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

public static T Clamp<T>(this T value, T min, T max)
    where T : IComparable<T>
{
    if (value.CompareTo(max) > 0)
        return max;

    if (value.CompareTo(min) < 0)
        return min;

    return value;
}



private Int32? _zip;
public Int32? Zip
{
    get
    {
        return _zip;
    }
    set
    {
        _zip = value.Clamp<Int32?>(0, 99999);
    }
}
هل كانت مفيدة؟

المحلول

تذكر, Int32? هو اختصار ل Nullable<Int32>.منذ Nullable<T> لا تنفذ IComparable<T>, ، لن يتم تجميع الكود الخاص بك ، كما هو منظم.

ومع ذلك ، يمكنك زيادة التحميل على الطريقة:

public static T? Clamp<T>(this T? value, T? min, T? max) 
    where T : struct, IComparable<T> 
{ 
    // your logic...
} 

وبطبيعة الحال ، إذا كنت تخطط للعمل مع أنواع لاغية ، لديك لتحديد كيف سوف المشبك null القيم...

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

public Int32? Zip
{
   ...
   set
   {
       _zip = value == null ? value : value.Value.Clamp<Int32>(0,99999);
   }

أو الأفضل من ذلك ، اجعله جزءا من تنفيذ الحمل الزائد الإضافي إلى Clamp...

نصائح أخرى

كما قال بواسطة lbushkin nullable أو t؟لا ينفذ واجهة مثبتة.الحل المحدد على ما يرام، ومع ذلك أفضل أن يكون لديك منطق مقارنة بغيض داخل فئة متخصصة في هذه المسألة، بعد مبدأ المسؤولية الفردية ، وكذلك أيضا مما يمكن استخدامه لمقارنة أي أنواع غير قابلة للنظر.

على سبيل المثال، يمكنك إنشاء فئة مقارنة من نوع عام مثل هذا:

giveacodicetagpre.

في هذه الحالة، ستستخدم هذه الفئة مثل هذا:

giveacodicetagpre.

مفيد للحفظ في مكتبة مساعدتك.

آمل أن يساعد!

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