問題 §
決まり切った数があって定数として定義したい。直接書くと長くなるので式で書きたいがエラーになってしまう。式で書いても通る場合がある。
private const string confirmationStringC = new string(Enumerable.Range(0x20, 256 - 0x20).Cast<char>().ToArray());
原因 §
コンパイラが解決できる式は定数の値として利用できるが、コンパイラが解決できない式は値として使用できない。つまり、1+2は使えるが上記のようなメソッド呼び出しを含む複雑な式はコンパイラが解決できない。明らかに何回実行しても、同じ値にしかならないが、コンパイラはそこまで見抜けない。
解決 §
readonlyを使う。読み出し専用の変数ならどんな式でも初期化できる。読み出し専用の変数はコンパイル時ではなく初期化時に値が確定するものであり、コンパイラが値を確定できなくても使用できる。
private static readonly string confirmationString = new string(Enumerable.Range(0x20, 256 - 0x20).Cast<char>().ToArray());