当您在期望使用Expression的地方使用自定义方法时,如何创建c#编译错误?

本文关键字:何创建 创建 错误 编译 期望 Expression 自定义方法 方使用 | 更新日期: 2023-09-27 18:09:44

当您在期望使用Expression的地方使用自定义方法时,如何创建c# 编译错误?

确实,包含自定义方法调用的Lambda表达式从技术上讲也是表达式。但是,由于像LINQ to SQL, LINQ to JSON等表达式的消费者不期望它,它们抛出运行时错误。

如何让编译器知道像LINQ to SQL等框架需要什么,不允许什么

当您在期望使用Expression的地方使用自定义方法时,如何创建c#编译错误?

无能为力,原因如下:

  1. 包含方法调用的lambda表达式(!)仍然是表达式
  2. 并不是所有的方法调用都是非法的。一些方法被理解并正确翻译。所以,即使你找到了一种方法,只允许不调用方法的lambda表达式,你也会禁止所有的方法调用,即使是有效的。

这不可能。这类似于要求字符串类型的变量不能包含某些字符。编译器不能检查这个,因为变量的实际内容只有在运行时才知道。

也就是说,从lambda表达式到Expression实例的转换是由编译器完成的,所以理论上/技术上,人们可以想象一个与编译器集成的"LINQ编译器服务",并在编译时提供有关所支持结构的信息。

这显然需要在编译器和LINQ提供程序中做大量的工作(在这种情况下,LINQ提供程序的作者也应该实现这个' LINQ编译器接口'来集成这个编译器服务)。

我不指望这个在不久的将来可用。也许整个"编译器即服务"(又名Roslyn)可以实现这个场景?