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



Answers

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

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

void Foo()
{
    Foo(TimeSpan.FromSeconds(2.0));
}
void Foo(TimeSpan span)
{
    //...
}
Question

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

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

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




اقتراحي:

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

    //...
}

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




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

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



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

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

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

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

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

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




Links