1. ホーム
  2. c#

[解決済み] C# 4.0: TimeSpanをデフォルト値でオプションのパラメータとして使用できますか?

2022-06-08 10:40:56

質問

どちらもコンパイル時定数でなければならないというエラーが発生します。

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

まず第一に、なぜこれらの値がコンパイル時に決定されないのか、誰か説明してください。また、オプションのTimeSpanオブジェクトのデフォルト値を指定する方法はありますか?

どのように解決するのですか?

署名を変更することで、非常に簡単に回避することができます。

void Foo(TimeSpan? span = null) {

   if (span == null) { span = TimeSpan.FromSeconds(2); }

   ...

}

私は詳しく説明しなければなりません - あなたの例の中のこれらの式がコンパイル時の定数でない理由は、コンパイル時に、コンパイラは単にTimeSpan.FromSeconds(2.0)を実行して、結果のバイトをコンパイルしたコードに貼り付けることはできないからです。

例として、代わりにDateTime.Nowを使用しようとした場合を考えてみましょう。DateTime.Nowの値は、実行されるたびに変化します。あるいは、TimeSpan.FromSecondsが重力を考慮に入れたとします。無茶な例だが、コンパイル時の定数のルールは、たまたまTimeSpan.FromSecondsが決定論的であることを知っているからといって、特別なケースを作らないのだ。