نوع عام نولابل المستخدمة مع إيكومبال.هل من الممكن?
-
18-09-2020 - |
سؤال
أحاول إنشاء مشبك بسيط (حتى أتمكن من ربط قيم أي شيء مماثل ...في الغالب لأنواع الأرقام مثل كثافة العمليات ، مزدوجة ، إلخ.)
المشكلة هي إذا كنت تفعل ما يلي أحصل على خطأ ، ولكن وفقا ل مسن ومن المفترض أن تكون قادرة على التعامل مع القيم الفارغة.
اقتباس:"بحكم التعريف ، أي كائن يقارن أكبر من فارغة ، واثنين من المراجع فارغة مقارنة متساوية مع بعضها البعض."
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
على سبيل المثال، يمكنك إنشاء فئة مقارنة من نوع عام مثل هذا:
giveacodicetagpre.في هذه الحالة، ستستخدم هذه الفئة مثل هذا:
giveacodicetagpre.مفيد للحفظ في مكتبة مساعدتك.
آمل أن يساعد!