An expression tree may not contain a reference to a local function(表达式树不能包含对局部函数的引用)
问题描述
错误:表达式树不能包含对本地函数的引用
public void Initialize()
{
CloudStorageProperties ImageFileProperties(string fileName) => _cloudStorage.GetBlob(CloudStorageType.Image, fileName).FileProperties;
Config = new MapperConfiguration(x =>
{
x.CreateMap<Category, CategoryViewModel>()
.ForMember(vm => vm.ImagePath, m => m.MapFrom(src => ImageFileProperties(src.ImageFile.Name).Uri.AbsoluteUri));
});
}
我可以用匿名函数替换本地函数,它可以工作,但Re Sharper说我应该将其转换为本地函数。
为什么不允许这样做?
推荐答案
下面是Roslyn中进行此更改的pull request:
现在不允许在表达式树中引用局部函数, 这在未来可能会改变,也可能不会改变(以前是 作为对损坏的方法名称的引用生成,看起来 错误)。为此添加了新错误。
因此其背后的推理是:当您引用表达式树中的方法时,它被表示为具有给定方法名称的MethodCall
表达式。如果引用名称为ImageFileProperties
的局部函数,则应该使用相同名称的MethodCall
。表达式树的目的是被分析和解构,所以名字在那里很重要。但在现实中,局部函数被编译为名称类似于<Initialize>g__ImageFileProperties1_0
的静态函数(在上面的引号中称为"损坏的方法名")。出于这个原因,Roslyn开发人员决定不允许这样做,以避免混淆(源代码中看到的函数的名称和表达式树中的函数的名称)。使用匿名函数时不会出现这种混淆,因此允许使用匿名函数。
这篇关于表达式树不能包含对局部函数的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:表达式树不能包含对局部函数的引用
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- 输入按键事件处理程序 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01