Skip to content

Commit 22c3a14

Browse files
authored
Fix correctly type nulls (and other constants) (#354)
1 parent 553d0a3 commit 22c3a14

File tree

2 files changed

+20
-11
lines changed

2 files changed

+20
-11
lines changed

src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1518,10 +1518,12 @@ Expression ParseTypeAccess(Type type)
15181518
{
15191519
Expression[] args = shorthand ? new[] { ParseStringLiteral() } : ParseArgumentList();
15201520

1521-
// If only 1 argument, and the arg is ConstantExpression, just return the ConstantExpression
1522-
if (args.Length == 1 && args[0] is ConstantExpression)
1521+
// If only 1 argument, and the arg is ConstantExpression, return the conversion
1522+
// If only 1 argument, and the arg is null, return the conversion (Can't use constructor)
1523+
if (args.Length == 1
1524+
&& (args[0] == null || args[0] is ConstantExpression))
15231525
{
1524-
return args[0];
1526+
return GenerateConversion(args[0], type, errorPos);
15251527
}
15261528

15271529
// If only 1 argument, and if the type is a ValueType and argType is also a ValueType, just Convert

test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs

+15-8
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ public void Parse_ParseAndOperator(string expression, string result)
7171
}
7272

7373
[Theory]
74-
[InlineData("string(null)", null)]
7574
[InlineData("string(\"\")", "")]
7675
[InlineData("string(\"a\")", "a")]
77-
public void Parse_CastStringShouldReturnConstantExpression(string expression, object result)
76+
[InlineData("int(42)", 42)]
77+
public void Parse_CastStringIntShouldReturnConstantExpression(string expression, object result)
7878
{
7979
// Arrange
8080
ParameterExpression[] parameters = { ParameterExpressionHelper.CreateParameterExpression(typeof(bool), "x") };
@@ -88,20 +88,27 @@ public void Parse_CastStringShouldReturnConstantExpression(string expression, ob
8888
}
8989

9090
[Theory]
91-
[InlineData("int?(null)", null)]
92-
[InlineData("int?(5)", 5)]
93-
[InlineData("int(42)", 42)]
94-
public void Parse_CastIntShouldReturnConstantExpression(string expression, object result)
91+
#if NET452
92+
[InlineData("int?(5)", typeof(int?), "Convert(5)")]
93+
[InlineData("int?(null)", typeof(int?), "Convert(null)")]
94+
[InlineData("string(null)", typeof(string), "Convert(null)")]
95+
#else
96+
[InlineData("int?(5)", typeof(int?), "Convert(5, Nullable`1)")]
97+
[InlineData("int?(null)", typeof(int?), "Convert(null, Nullable`1)")]
98+
[InlineData("string(null)", typeof(string), "Convert(null, String)")]
99+
#endif
100+
public void Parse_NullableShouldReturnNullable(string expression, object resultType, object result)
95101
{
96102
// Arrange
97103
ParameterExpression[] parameters = { ParameterExpressionHelper.CreateParameterExpression(typeof(bool), "x") };
98104
var sut = new ExpressionParser(parameters, expression, null, null);
99105

100106
// Act
101-
var constantExpression = (ConstantExpression)sut.Parse(null);
107+
var unaryExpression = (UnaryExpression)sut.Parse(null);
102108

103109
// Assert
104-
Check.That(constantExpression.Value).Equals(result);
110+
Check.That(unaryExpression.Type).Equals(resultType);
111+
Check.That(unaryExpression.ToString()).Equals(result);
105112
}
106113
}
107114
}

0 commit comments

Comments
 (0)