转换十进制?在早期版本的 .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
于是搜索了类似的问题,没看到结果
一直弹出的错误是
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