为什么编译器没有对静态表达式树使用相同的对象引用?

Rez*_*eni 4 c# expression-trees

我知道表达式树是不可变的,那么为什么编译器不对静态表达式使用相同的对象引用,比如字符串文字呢?

要澄清问题,请参阅示例:

static void Main(string[] args)
{
    Test(p => true);//2637164
    Test(p => true);//3888474
    Test("true");//-292522067
    Test("true");//-292522067
    Console.ReadKey();
}

public static void Test(Expression<Func<string,bool>> exp)
{
    Console.WriteLine(exp.GetHashCode());
}

public static void Test(string str)
{
    Console.WriteLine(str.GetHashCode());
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 8

我知道表达式树是不可变的,那么为什么编译器不对静态表达式使用相同的对象引用,比如字符串文字呢?

规范说允许编译器但不需要实习相同的lambdas.

字符串文字由运行时免费实现; 编译器开发人员无需花费任何成本.

我没有实习表达树的原因是因为每天我们花费无意义的不必要的"优化"来实现不切实际的场景,实际上不会消耗宝贵的资源,这是Visual Studio可能会减少其日程安排的一天.我们花了那么多时间进行实际优化.