Я пишу метод со следующей подписью:Возможная ошибка компилятора при генерации шаблонный метод
public class Map<TSource,TDestination>
{
public void Map<TSourceProperty, TDestinationProperty>(
Expression<Func<TSource, TSourceProperty>> sourcePropertySelector,
Expression<Func<TDestination, TDestinationProperty>> destinationPropertySelector,
Expression<Func<TSourceProperty, TDestinationProperty>> converter){}
}
метод вызывается так:
example1- Map(a => a.StringProperty, b => b.IntProperty, c => Int32.Parse(c))
example2- Map(a => a.NullabelInt32, b => b.Int32, c => c == null ? 0 : c)
При вызове этого метода это случается, что TDestinationProperty не всегда имеет правильный тип, то есть тип выбранного объекта.
В приведенном выше примере 1 TDestinationProperty
является правильным видом типа Int32
; но в примере 2 TDestinationProperty
всегда заканчивается тем же, что и TSourceProperty
, то есть в примере2 конкретного случая, Nullable<int>
.
Поскольку я полагаюсь на этот тип для выполнения других сложных операций, все перечисленные ниже сбой. Я, хотя это как-то связано с перекомпиляцией решения, поэтому я очищаю и перекомпилирую, но этот бит просто не работает.
Чтобы быть честным, у меня все еще есть рабочий обход для этого, но дело в том, чтобы понять, есть ли у меня какая-то ошибка компиляции или что-то в этом роде.
Есть идеи? Можете ли вы воспроизвести это?
Будет ли это работать: '... c => c == null? 0: c.Value) '? –
Вы можете сделать 'c => c ??0'. – juharr
Замечание: пожалуйста, перечитайте руководство [MCVE] ... На самом деле вам не нужен такой сложный тип, чтобы показать поведение - одного параметра будет достаточно «Map (Func> converter) ... и 'c => c == null? 0: c' можно упростить до 'c => c' ... –