gpt4 book ai didi

c# - ConstantExpression 不是常量

转载 作者:行者123 更新时间:2023-12-02 04:58:58 24 4
gpt4 key购买 nike

给定 Msdn:常量表达式是可以在编译时完全求值的表达式。

但是在下面的示例代码中,我有一个无法在编译时求值的 contantExpression。

我应该错过了什么,但是什么?

public class SomeClass
{
public string Key { get; set; }
}

public static void Sample()
{
var wantedKey = Console.ReadLine();
Expression<Func<SomeClass, bool>> expression = c => c.Key == wantedKey;

var maybeAConstantExpression = ((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;

//Both are true, so we have a constantExpression,righ and Value should be known
Console.WriteLine(maybeAConstantExpression.NodeType == ExpressionType.Constant);
Console.WriteLine(maybeAConstantExpression.GetType() == typeof(ConstantExpression));

var constantExpression = ((ConstantExpression)maybeAConstantExpression);
var constantValue = constantExpression.Value;

//ConsoleApplication1.Program+<>c__DisplayClass0
//Do not looks like a constant..this is a class...
Console.WriteLine(constantValue);

var fakeConstantValue = constantValue.GetType().GetField("wantedKey").GetValue(constantValue);
//Return the value entered whith Console.ReadLine
//This is not really known at compile time...
Console.WriteLine(fakeConstantValue);
}

最佳答案

const 是可以在编译时求值的东西。 ConstantExpression 仅仅代表一个固定值。这可能来自编译时,但这不是必需的,而且通常也不是。

常量表达式(在 C# 语言意义上)和 ConstantExpression(运行时对象)之间存在差异。

您的情况中的 constantValue 代表捕获上下文 - 提升 wantedKey 的静默类。基本上,该代码是(通过编译器):

class HorribleNameThatYouCannotSay {
public string wantedKey; // yes, a public field
}
...
static void Sample()
{
var ctx = new HorribleNameThatYouCannotSay();
ctx.wantedKey = Console.ReadLine();
var p = Expression.Parameter(typeof(SomeClass), "c");
Expression<Func<SomeClass, bool>> expression =
Expression.Lambda<Func<SomeClass, bool>>(
Expression.Equal(
Expression.PropertyOrField(p, "Key"),
Expression.PropertyOrField(
Expression.Constant(ctx), "wantedKey")
), p);
);
}

或者非常接近的东西

但它可能只是:

string wantedKey = Console.ReadLine();
var p = Expression.Parameter(typeof(SomeClass), "c");
Expression<Func<SomeClass, bool>> expression =
Expression.Lambda<Func<SomeClass, bool>>(
Expression.Equal(
Expression.PropertyOrField(p, "Key"),
Expression.Constant(wantedKey, typeof(string))
), p);

如果您使用 Expression API 手动编写它(即像上面那样)

关于c# - ConstantExpression 不是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17443884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com