5

type のクラス定数フィールドを宣言できないのはなぜですかLambda Expression。私はこのようなものが欲しい:

class MyClass
{
   public const Expression<Func<string,bool>> MyExpr = (string s) => s=="Hello!";
}

しかし、コンパイルエラーが発生します:Expression cannot contain anonymous methods or lambda expressions

4

2 に答える 2

8

これは、C# と CLR の単なる制限です。null定数値フィールドの値として使用できるのは、プリミティブ数値、文字列リテラルのみです。式ツリーは、オブジェクトの通常のグラフとして表され、定数値として表示できません。

于 2013-10-05T14:30:43.740 に答える
4

再現。これは、コンパイラからの奇妙なエラー メッセージです。代わりに期待します:

エラー CS0134: '(field)' のタイプは '(type)' です。文字列以外の参照型の const フィールドは、null でのみ初期化できます。

私たちが受け取るメッセージは誤解を招くものです。一部のC# 式 (私は .NET 式ツリーについて話しているわけではありませんExpression<...>) には明らかにラムダ式を含めることができますが、この特定の式ができない理由については述べていません。

解決策は、static readonly代わりにフィールドを作成することです。

class MyClass
{
   public static readonly Expression<Func<string, bool>> MyExpr
     = s => s == "Hello!";
}

のインスタンスは 1 つだけExpression<>作成されますが、コンパイル時の定数ではありません。実際には、が初めて使用される前に (直前に) 1 回実行されるコードがいくつかありますMyClass

于 2013-10-05T14:33:03.753 に答える