我将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
答案 0 :(得分:2)
Function
的重点是返回一些东西。在您的第一个代码段中,您的匿名函数返回了什么?它没有返回任何内容,因为它没有Return
语句。如果您实际上没有任何要返回的内容,则无需任意添加Return
语句,如果不是AddProfile
,则无法返回Sub
的结果。什么都不归。基本上,你的lambda没有返回任何东西,我们称之为不返回任何东西的方法是什么?它是Initialize
。
您在发布的错误消息中会注意到,Action
方法重载会将委托作为参数,期望Func
而不是Action
。使用Sub
创建Function
个代理,而Func
代理用于创建which
代理。