12

更新:以下が実際に有効であるため、これはコンパイラのレッドニシンのようです。

const int MyInt = default(int);

問題は、 の使用ではなくDateTime、有効な ではないことにあります。constdefault

私にとっての混乱の主な原因は、それがオプションのパラメータで特別に処理されていることに気付いていなかったことです (そして、エラーメッセージが他の可能な条件を省略しているため、コンパイル時定数として扱われているdefault(DateTime)という誤った結論に達しました)。default(DateTime)これは、MarcinJuraszek の回答で取り上げられています。


元の質問:

これは、この回答から別の質問へのMarc Gravell のコメントから恥知らずに切り取られたものです。

以下が有効な理由:

// No compiler errors, default(DateTime) seems to satisfy the compile-time constant requirement.
public static void DoSomething(DateTime date = default(DateTime))
{ 
}

しかし、以下はそうではありません:

// Compiler error: "Constant initializer must be compile-time constant.
const DateTime MyDate = default(DateTime); 

両方とも「コンパイル時定数」を必要としているように見えるため (DateTime.MinValueオプションのパラメーターのようなものを提供しようとすると、コンパイラーはそれがコンパイル時定数ではないと不平を言います):

// Compiler error: Default parameter value for 'date' must be a compile-time constant.
public static void DoSomething(DateTime date = DateTime.MinValue) {}

コンパイラがこれらを異なる方法で処理する原因となる舞台裏で何が起こっているのでしょうか?

4

3 に答える 3