AutoMapper初始化中的Lambda将警告显示为功能但显示为子

时间:2017-10-29 05:32:45

标签: vb.net lambda automapper-6

我将AutoMapper V3.3.1更新为V6.1.1并且令我惊讶的是,在将所有CreateMaps()放入配置文件后,它实际上完全正常工作 - 对我来说几乎可怕。

我遇到的问题是它正在使用AutoMapper文档中建议的以下代码:

Private Sub InitiatizeAutoMapper()
    Mapper.Initialize(Function(cfg)
                          cfg.AddProfile(Of MappingProfile)()
                      End Function)
End Sub

但代码发出警告:

Warning BC42105 Function '<anonymous method>' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

如果我将回复添加到Lambda,如:

Private Sub InitiatizeAutoMapper()
    Mapper.Initialize(Function(cfg)
                          Return cfg.AddProfile(Of MappingProfile)()
                      End Function)
End Sub

然后我收到以下错误:

Error   BC30518 Overload resolution failed because no accessible 'Initialize' can be called with these arguments:
    'Public Shared Overloads Sub Initialize(config As Action(Of IMapperConfigurationExpression))': Expression does not produce a value.
    'Public Shared Overloads Sub Initialize(config As Action(Of IMapperConfigurationExpression))': Expression does not produce a value.
    'Public Shared Overloads Sub Initialize(config As MapperConfigurationExpression)': Lambda expression cannot be converted to 'MapperConfigurationExpression' because 'MapperConfigurationExpression' is not a delegate type.

现在 - 如果我将它设为Sub而不是函数,那么一切都运行良好,没有这样的错误:

Private Sub InitiatizeAutoMapper()
    Mapper.Initialize(Sub(cfg)
                          cfg.AddProfile(Of MappingProfile)()
                      End Sub)
End Sub

我知道这可能是一个头脑冷静,但我试图遵循文档,我害怕将其发布到生产中,因为我可能会遗漏一些东西。

修改

我选择打破多行lambda使它对我来说更容易一些,它也非常方便地使用IntelliSense选项以便将来增强。虽然它可能不是“最酷”的代码,但我发现它非常易读。

Private Sub InitiatizeAutoMapper()
    Dim config As New Configuration.MapperConfigurationExpression : With config
        .AddProfile(Of MappingProfile)()
    End With
    Mapper.Initialize(config)
End Sub

1 个答案:

答案 0 :(得分:2)

Function的重点是返回一些东西。在您的第一个代码段中,您的匿名函数返回了什么?它没有返回任何内容,因为它没有Return语句。如果您实际上没有任何要返回的内容,则无需任意添加Return语句,如果不是AddProfile,则无法返回Sub的结果。什么都不归。基本上,你的lambda没有返回任何东西,我们称之为不返回任何东西的方法是什么?它是Initialize

您在发布的错误消息中会注意到,Action方法重载会将委托作为参数,期望Func而不是Action。使用Sub创建Function个代理,而Func代理用于创建which代理。