diff --git a/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs b/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs index 7ba6694b31d2..e935599f8cea 100644 --- a/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs +++ b/tracer/src/Datadog.Trace/Debugger/Expressions/ProbeExpressionParser.cs @@ -441,7 +441,15 @@ private Expression HandleReturnType(Expression finalExpr, List object), + // we need an explicit conversion. + return Expression.Convert(finalExpr, typeof(T)); } if (typeof(T).IsNumeric() diff --git a/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs b/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs index 13af04659172..c41299dc44b8 100644 --- a/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Debugger/DebuggerExpressionLanguageTests.cs @@ -111,6 +111,32 @@ public async Task TestMetrics(string expressionTestFilePath) await Test(expressionTestFilePath); } + [Fact] + public void ProbeExpressionParser_ObjectReturnType_AllowsValueTypeResults() + { + // Arrange + var scopeMembers = CreateScopeMembers(); + const string json = """ + { + "ref": "@duration" + } + """; + + // Act + var compiled = ProbeExpressionParser.ParseExpression(json, scopeMembers); + var result = compiled.Delegate( + scopeMembers.InvocationTarget, + scopeMembers.Return, + scopeMembers.Duration, + scopeMembers.Exception, + scopeMembers.Members); + + // Assert + Assert.NotNull(result); + Assert.IsType(result); + Assert.True(compiled.Errors == null || compiled.Errors.Length == 0); + } + private async Task Test(string expressionTestFilePath) { // Arrange