Лямбда при инициализации AutoMapper показывает предупреждение как функцию, но отлично как суб
Я обновил 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.
Если я добавлю Возврат в Лямбду, как:
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
Я знаю, что это, вероятно, будет шутка, но я пытаюсь следовать документации и боюсь выпустить это в производство, потому что я могу что-то упустить.
РЕДАКТИРОВАТЬ:
Я решил сломать многострочную лямбду, чтобы мне было легче, что также позволяет легко использовать опции IntelliSense для дальнейшего улучшения. Хотя это, вероятно, не самый "крутой" код, я нахожу его очень читабельным.
Private Sub InitiatizeAutoMapper()
Dim config As New Configuration.MapperConfigurationExpression : With config
.AddProfile(Of MappingProfile)()
End With
Mapper.Initialize(config)
End Sub
1 ответ
Весь смысл Function
в том, что он что-то возвращает. Что в вашей первой части кода возвращает анонимная функция? Он ничего не возвращает, потому что не имеет Return
заявление. Там нет смысла произвольно добавлять Return
заявление, если на самом деле вам нечего вернуть, и вы не можете вернуть результат AddProfile
если это ничего не возвращает само. По сути, ваша лямбда ничего не возвращает, и как мы называем метод, который ничего не возвращает? Это Sub
,
В сообщении об ошибке, которое вы разместили, вы заметите, что Initialize
перегрузки метода, которые принимают делегата в качестве аргумента, ожидают Action
не Func
, Action
делегаты создаются с Sub
в то время как Function
используется для создания Func
делегировать.