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


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))

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




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

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

  • المعنويات بما في ذلك فارغة
  • مراجع لقيم كونست الأخرى
  • قيم التعداد
  • تعبير القيمة الافتراضية

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




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

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



اقتراحي:

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

            //...
        }

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