私は何らかの方法で次のことをやろうとしています:
const char EscapeChar = '\\';
const string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)
これはコンパイルされません。それを機能させる別の方法はありますか?
C# 言語仕様(§ 17.3 および 14.16) から:
17.3 定数
定数は、定数値 (コンパイル時に計算できる値) を表すクラス メンバーです。
と
14.16 定数式
定数式は、コンパイル時に完全に評価される式です。式が定数である必要がある場合、これは定数式を使用して文法で示されます。[...] 次の構造は、定数式で許可されています。
- リテラル (null リテラルを含む)
- クラスおよび構造体型の const メンバーへの参照。
- 列挙型のメンバーへの参照。
- それ自体が定数式である、括弧で囲まれた部分式。
- ターゲットの型が上記の型のいずれかである場合は、式をキャストします。
- 定義済みのチェック済みおよびチェックなしの +、–、!、および ~ 単項演算子。
- 定義済みの +、–、*、/、%、<<、>>、&、|、^、&&、||、==、!=、<、>、<=、および >= 二項演算子。オペランドは上記のタイプです。
- ?: 条件演算子。
- unmanaged-type が §14.5.12 で指定されたタイプの 1 つである場合、sizeof 式。
- 型が上記の型のいずれかである場合、または型が参照型または参照型であることがわかっている型パラメーターである場合は、既定値式 (§25.7)。
定数式では、次の変換が許可されています。
- ID 変換
- 数値変換
- 列挙変換
目的を達成する別の方法は、静的な読み取り専用メンバーを使用することです。読み取り専用メンバーは、コンパイル時ではなく実行時に評価されます。したがって、ToString() メソッドを使用できます。
private static readonly EscapeString = EscapeChar.ToString();
注:読み取り専用フィールドはクラスの宣言時またはコンストラクターで初期化できるため、使用するコンストラクターによって読み取り専用フィールドの値が異なる場合があります。
const メンバーと readonly メンバーの違いについては、こちらの記事を参照してください。
私はそれを行う方法がわかりませんが、それは少し残念なことに同意します-しかし、あなたは本当にそれがの代わりになる必要がありますか? 後者のセマンティクスはほぼ同じです。const
static readonly
私が考えることができる唯一の方法(どちらも理想的ではありません)は次のとおりです。
const string EscapeString = "\\";
private static readonly EscapeString = EscapeChar.ToString();
または、文字列バージョンが必要なときはいつでも char バージョンと ToString() に固執することもできます:)
C#.Net const では、コンパイル時に値を初期化する必要があります。それが理由です。コードがコンパイルされていません。readonly フィールドを使用して実行時の値を割り当てることができます。
ただし、次のコードは機能します。
const char EscapeChar = '\\';
readonly string EscapeString = EscapeChar.ToString(); // or ("" + EscapeChar)