@@ -14,6 +14,7 @@ protected override Expression VisitNew(NewExpression node)
14
14
{
15
15
return Expression . Convert ( Visit ( node . Arguments [ 0 ] ) , node . Type ) ;
16
16
}
17
+
17
18
return base . VisitNew ( node ) ;
18
19
}
19
20
@@ -45,10 +46,21 @@ protected override Expression VisitConditional(ConditionalExpression node)
45
46
return boolValue ? ifTrue : ifFalse ;
46
47
}
47
48
48
- if ( IsCoalesce ( test , ifTrue , out var expression ) )
49
+ if ( IsCoalesce ( test , UnwrapConvertToNullable ( ifTrue ) , out var expression ) )
49
50
{
51
+ if ( IsNullConstant ( ifFalse ) )
52
+ {
53
+ if ( expression . Type != node . Type )
54
+ {
55
+ expression = Expression . Convert ( expression , node . Type ) ;
56
+ }
57
+
58
+ return expression ;
59
+ }
60
+
50
61
return Expression . Coalesce ( expression , ifFalse ) ;
51
62
}
63
+
52
64
var ifTrueBinary = UnwrapConvertToNullable ( ifTrue ) as BinaryExpression ;
53
65
if ( ifTrueBinary != null )
54
66
{
@@ -112,6 +124,11 @@ protected override Expression VisitConditional(ConditionalExpression node)
112
124
return node . Update ( test , ifTrue , ifFalse ) ;
113
125
}
114
126
127
+ static bool IsNullConstant ( Expression expression )
128
+ {
129
+ return expression is ConstantExpression constant && constant . Value == null ;
130
+ }
131
+
115
132
private static bool TryConvert ( ConstantExpression constant , BinaryExpression left , Expression right , out BinaryExpression result , bool isLeft )
116
133
{
117
134
if ( constant ? . Value is bool booleanValue )
@@ -237,11 +254,13 @@ static Expression ConvertToNullable(Expression expression)
237
254
238
255
static Expression UnwrapConvertToNullable ( Expression expression )
239
256
{
240
- var unary = expression as UnaryExpression ;
241
- if ( unary != null && expression . NodeType == ExpressionType . Convert && expression . Type . IsNullableType ( ) )
257
+ if ( expression is UnaryExpression unary &&
258
+ expression . NodeType == ExpressionType . Convert &&
259
+ expression . Type . IsNullableType ( ) )
242
260
{
243
261
return unary . Operand ;
244
262
}
263
+
245
264
return expression ;
246
265
}
247
266
@@ -261,9 +280,8 @@ static bool ExtractNullableArgument(Expression hasValue, Expression getValueOrDe
261
280
262
281
static bool IsCoalesce ( Expression hasValue , Expression getValueOrDefault , out Expression expression )
263
282
{
264
- MemberExpression memberExpression ;
265
- MethodCallExpression callExpression ;
266
- if ( IsHasValue ( hasValue , out memberExpression ) && IsGetValueOrDefault ( getValueOrDefault , out callExpression ) )
283
+ if ( IsHasValue ( hasValue , out var memberExpression ) &&
284
+ IsGetValueOrDefault ( getValueOrDefault , out var callExpression ) )
267
285
{
268
286
expression = memberExpression . Expression ;
269
287
if ( expression == callExpression . Object )
0 commit comments