c# C # 4.0: هل يمكنني استخدام TimeSpan كمعلمة اختيارية ذات قيمة افتراضية؟



4 Answers

إن تراث VB6 يجعلني غير مرتاح بفكرة اعتبار "القيمة الفارغة" و "القيمة المفقودة" مكافئة. في معظم الحالات ، ربما يكون ذلك جيدًا ، ولكن قد يكون لديك تأثير جانبي غير مقصود ، أو قد تبتلع حالة استثنائية (على سبيل المثال ، إذا كان مصدر span عبارة عن خاصية أو متغير لا يجب أن يكون خاليًا ، ولكنه).

لذلك فإنني أفرط في تحميل الطريقة:

void Foo()
{
    Foo(TimeSpan.FromSeconds(2.0));
}
void Foo(TimeSpan span)
{
    //...
}
c# c#-4.0 default-value timespan optional-parameters

ينتج عن كل منهما خطأ يقول أنه يجب أن يكون ثابتًا لوقت الترجمة:

void Foo(TimeSpan span = TimeSpan.FromSeconds(2.0))
void Foo(TimeSpan span = new TimeSpan(2000))

بادئ ذي بدء ، هل يمكن لأي شخص أن يفسر لماذا لا يمكن تحديد هذه القيم في وقت التحويل البرمجي؟ وهل هناك طريقة لتحديد قيمة افتراضية لكائن TimeSpan اختياري؟




مجموعة القيم التي يمكن استخدامها كقيمة افتراضية هي نفسها التي يمكن استخدامها لوسيطة السمة. السبب يتم ترميز القيم الافتراضية في بيانات التعريف داخل DefaultParameterValueAttribute .

لماذا لا يمكن تحديده في وقت الترجمة. يتم سرد مجموعة القيم والتعبيرات على مثل هذه القيم المسموح بها في وقت التحويل البرمجي في مواصفات لغة C # الرسمية :

C # 6.0 - أنواع معلمات سمة :

تقتصر أنواع المعلمات الموضعية والمسمى لفئة السمة على أنواع معلمات السمات ، وهي:

  • أحد الأنواع التالية: bool ، byte ، char ، double ، float ، int ، long ، sbyte ، short ، string ، uint ، ulong ، ushort .
  • object الكتابة.
  • النوع System.Type .
  • نوع التعداد.
    (بشرط أن يكون لديه إمكانية وصول عامة وأنواع متداخلة (إن وجدت) أيضًا إمكانية وصول عامة)
  • مصفوفات أحادية البعد للأنواع المذكورة أعلاه.

النوع TimeSpan لا يتناسب مع أي من هذه القوائم وبالتالي لا يمكن استخدامه كثابت.




TimeSpan هي حالة خاصة لـ DefaultValueAttribute ويتم تحديدها باستخدام أي سلسلة يمكن تحليلها عبر أسلوب TimeSpan.Parse .

[DefaultValue("0:10:0")]
public TimeSpan Duration { get; set; }



اقتراحي:

void A( long spanInMs = 2000 )
{
    var ts = TimeSpan.FromMilliseconds(spanInMs);

    //...
}

BTW TimeSpan.FromSeconds(2.0) لا يساوي new TimeSpan(2000) - يأخذ منشئ القراد.




Related