【问题标题】:Visual Studio Immediate window "Internal error in the expression evaluator"Visual Studio 即时窗口“表达式计算器中的内部错误”
【发布时间】:2016-03-17 09:26:44
【问题描述】:

免责声明:我已经检查了this question,但这是关于即时窗口的。

我正在使用实体框架来获取一些结果,所以我有一个日志列表:

var result = ctx.Logging.Where(*filtering*).ToList();

但我想知道列表的不同数据类型(枚举、底层类型字节和Datatype 可以为空,如果我使它不可为空,它出于某种原因可以工作)。当我尝试在即时窗口中执行此操作时:

result.Select(r => r.Datatype).Distinct().ToList();

我收到消息:

表达式计算器中的内部错误。

但是,当我在代码中执行此操作时,它可以正常工作,例如var test = result.Select(r => r.Datatype).Distinct().ToList();。我已经尝试使用调试选项中的“托管兼容模式”和“旧表达式”,但随后我收到另一条消息:

表达式不能包含 lambda 表达式

我是否遗漏了什么或者这是 Visual Studio 2015 中的错误?

Minimal, Complete, and Verifiable example:

class Program
{
    static void Main(string[] args)
    {
        List<Test> tests = new List<Test>();
        for(int i = 0; i<100; i++)
        {
            if (i % 2 == 0)
                tests.Add(new Test { ID = i, Enum = TestEnum.Value1 });
            else
                tests.Add(new Test { ID = i, Enum = TestEnum.Value2 });
        }
        var distinct = tests.Select(t => t.Enum).Distinct().ToList();
    }
}

public enum TestEnum : byte
{
    Value1 = 1,
    Value2 = 2
}
public class Test
{
    public int ID { get; set; }
    public TestEnum? Enum { get; set; }
}

在代码tests.Select(t =&gt; t.Enum).Distinct().ToList(); 中有效,在即时窗口中无效。

【问题讨论】:

  • should works。等待:注意:不支持需要运行本机函数的 Lambda 表达式(例如 LINQ-to-SQL)。这可能会使您的问题与 @987654324 重复@
  • @Thomas 当我打开旧模式时,我只会得到“不能包含表达式”。如果我关闭它,我会得到“无法评估表达式”。但是,如果我使枚举不可为空,它可以在即时窗口中工作。看到你的编辑:我打电话给ToList 所以我不再使用 Linq-to-entities 或 Linq-to-sql,而是 Linq-to-object。
  • 那么我的咖啡时间。

标签: c# entity-framework visual-studio visual-studio-2015


【解决方案1】:

我认为这是表达式评估器中的一个错误,因为它似乎可以使用这样的解决方法:

tests.Select(t => t.Enum).ToList().Distinct().ToList()

下面是同样的结果:

? tests.Select(t => t.Enum).ToList().Distinct().ToList()
Count = 2
    [0]: Value1
    [1]: Value2

我注意到在您的代码中“快速观察”表达式也会导致错误:

Internal error in the expression evaluator.

至少在那个领域是一致的:-)

【讨论】:

【解决方案2】:

你的表达不行:

tests.Select(t => t.Enum).Distinct().ToList();
'Internal error in the expression evaluator.'

但那是因为 Enum 是可空类型。

tests.Select(t => t.Enum.Value).Distinct().ToList();
    'Count = 2
        [0]: Value1
        [1]: Value2'

事实上,EF 中使用的本机函数不适用于即时窗口中的 lambda 表达式。

【讨论】:

  • 当我使用价值时,它确实有效。我只是不明白为什么我可以在没有代码的情况下做到这一点,而不是在即时窗口中
  • 这似乎是表达式评估器中的一个错误,因为这不应给出不同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多