Fix #3702: Don't rewrite GetValueOrDefault() to == true in ?. chains

Turning bool?.GetValueOrDefault() into `== true` ends an enclosing
null-conditional chain, so `c?.Flag.GetValueOrDefault()` became
`(c?.Flag == true)` of type bool instead of bool?. A following `?? false`
then fails to compile (CS0019), and a following `.ToString()` yields
"False" instead of null when c is null. Keep the call when its target is
part of a ?. chain.
This commit is contained in:
dualfroz committed 2026-10-16 10:07:54 +02:00
1 parent 8e3e41fedb
commit ffe7e7b3f1
4 files changed
+37 -2

No files matched your search

@@ -380,7 +380,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
}
}
bool IsNullConditional(Expression target) => target switch {
internal static bool IsNullConditional(Expression target) => target switch {
UnaryOperatorExpression { Operator: UnaryOperatorType.NullConditional } => true,
MemberReferenceExpression member => IsNullConditional(member.Target),
InvocationExpression invocation => IsNullConditional(invocation.Target),