转换十进制?在早期版本的 .NET 中转换为十进制(C# 7.3 版)

Convert decimal? to decimal in earlier versions of .NET (C# Version 7.3)

于是搜索了类似的问题,没看到结果

一直弹出的错误是

Feature 'target-typed conditional expression' is not available in C# 7.3. Please use language version 9.0 or greater.

代码:

.Select(x => new FinancialStatementDto
 {
   Uid = Guid.NewGuid(),
   AccountNumber = x.Key.AccountNumber,
   Credit = x.Any(y => y.Credit.HasValue) ? Math.Abs((decimal)x.Sum(y => y.Credit)) : null,
   Debit = x.Any(y => y.Debit.HasValue) ? x.Sum(y => y.Debit) : null,
   AccountName = x.Key.AccountName
 });

错误弹出于 Credit = x.Any(y => y.Credit.HasValue) ? Math.Abs((decimal)x.Sum(y => y.Credit)) : null,

信用定义为 decimal? 但是 Math.Abs 函数不允许空值。

有什么想法吗?

P.S。必须在 7.3

版本上完成

你得到这个错误是因为你有一个 someBool ? someDecimal : null 类型的表达式,并且 9 之前的 C# 还不能使用赋值目标来推断 return 类型 decimal?

通常的解决方法是显式键入具有可空目标类型的任一表达式,即:

 someBool ? someDecimal : (decimal?)null

 someBool ? someDecimal : new decimal?()

 someBool ? (decimal?)someDecimal : null

请注意,如果编译器不知道目标类型,即使在 C# 9 中仍然需要此解决方法:

decimal? d = someBool ? someDecimal : null;       // compiles in C# 9 and above
var d = someBool ? someDecimal : null;            // never compiles
var d = someBool ? someDecimal : (decimal?)null;  // always compiles

(吹毛求疵:我所说的“始终”是指“C# 2.0 及更高版本”,因为可空类型是在 C# 2.0 中引入的。)

问题是您的条件的左侧是不可为 null 的 decimal,而右侧是 null。两者之间没有转换,C# 9 之前的语言不关心赋值的目标是普通类型(即decimal?)。

向左侧的 decimal? 添加强制转换将解决此问题:

Credit = x.Any(y => y.Credit.HasValue)
    ? (decimal?)Math.Abs((decimal)x.Sum(y => y.Credit))
    : null,

使用这个

Credit = x.Any(y => y.Credit.HasValue) ? Math.Abs(x.Sum(y => y.Credit ?? 0)) : null