1

値の型 (実際には列挙型) を引数として受け入れ、デフォルトの型で const フィールドを初期化するジェネリック クラスを定義しようとしています。

私は次のようなものが欲しい:

public abstract class GenericClass<ValueType> 
    where ValueType: struct, IConvertible
{
  public const ValueType val = default(ValueType);
}

残念ながら、コンパイラの不満があります (私は Mono を使用していますが、.NET でも同じだと思います)。エラーは次のとおりです。

エラー CS1959: 型パラメーター 'ValueType' は const として宣言できません

私のエラーは何ですか?

4

2 に答える 2

4

型パラメーターは定数型には使用できません。

astructを作成できないためconst( C# 仕様 10.4 Constantsより)

定数宣言で指定する型は、、、、、、、、、、、、、列挙型、または参照型でsbyteなければなりません。byteshortushortintuintlongulongcharfloatdoubledecimalboolstring

この制限に対する一種の回避策は、それを として宣言することstatic readonlyです。

public static readonly ValueType val = default(ValueType);
于 2013-07-23T17:57:35.500 に答える
1

MSDN の定義によると、定数式は、コンパイル時に完全に評価できる式です。

この SO answerによると、それはこのインタビューを参照しています:

Anders Hejlsberg: [...] CLR [共通言語ランタイム] では、List やその他のジェネリック型をコンパイルすると、通常の型と同様に IL [中間言語] とメタデータにコンパイルされます。もちろん、IL とメタデータには、型パラメーターがあることを認識している追加情報が含まれていますが、原則として、ジェネリック型は、他の型と同じようにコンパイルされます。実行時に、アプリケーションが最初に List を参照するとき、システムは誰かがすでに List を要求しているかどうかを確認します。そうでない場合は、List の IL とメタデータ、および型引数 int を JIT にフィードします。JITer は、IL を JIT する過程で、型パラメーターも置き換えます。

したがって、コンパイル時に型が定義されていないため、デフォルト値は実行時まで取得できません。

于 2013-07-23T17:57:35.527 に答える