При испытании Visual Studio 2015 RC я получил ошибку времени выполнения в ранее работавшем коде. Учитывая лямбду (x => x.CustomerStatusID == CustomerStatuses.Active)
, которая была передана функции как Expression<>
, отладчик показывает разницу в дереве выражений. Раньше он компилировался так:
.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
(System.Int32)$x.CustomerStatusID == 0
}
Но в C# 6.0 теперь он компилируется как
.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
(System.Int32)$x.CustomerStatusID == (System.Int32).Constant<Services.DataClasses.CustomerStatuses>(Active)
}
Хотя исправление моего кода обхода дерева было простым, и дополнительные детали приветствуются, кто-нибудь знает о каких-либо других подводных камнях, подобных этой?
В качестве альтернативы, есть ли у кого-нибудь ссылка на информацию о том, как было улучшено разрешение перегрузки? Я не могу найти.
Expression.Constant(0)
(то естьint
), а с Roslyn более корректно строит выражение типаExpression.Constant(CustomerStatuses.Active)
, то есть используя перечисление с его значением. Технически он строит выражение вродеExpression.Convert(Expression.Constant(CustomerStatuses.Active), typeof(int))
. Учитывая, что0
специально обрабатывается как значение перечисления, я протестировал его с1
. Тот же результат. - person xanatos   schedule 30.05.2015I received a run-time error on previously working code
. - person Erik Philips   schedule 30.05.20150
и обработка1
одинакова, поэтому отличается между C # 5.0 и 6.0 (по крайней мере, на трирослине) - person xanatos   schedule 30.05.2015(int)property == num
,(int)property == (int)enumValue
,property == enumValue
(третий - это тот, который вы обычно пишете, если пишете дерево выражений вручную ) - person xanatos   schedule 30.05.2015