转换成十进制?在早期版本的.NET(C#7.3版)中转换为十进制
所以在搜索了类似的问题后,我没有看到任何结果 不断出现的错误是 功能“目标类型条件表达式”在C#7.3中不可用。请使用9.0或更高版本的语言 守则:转换成十进制?在早期版本的.NET(C#7.3版)中转换为十进制,c#,type-conversion,decimal,c#-7.3,C#,Type Conversion,Decimal,C# 7.3,所以在搜索了类似的问题后,我没有看到任何结果 不断出现的错误是 功能“目标类型条件表达式”在C#7.3中不可用。请使用9.0或更高版本的语言 守则: .Select(x => new FinancialStatementDto { Uid = Guid.NewGuid(), AccountNumber = x.Key.AccountNumber, Credit = x.Any(y => y.Credit.HasValue) ? Math.Abs((decimal)
.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((十进制)x.Sum(y=>y.Credit)):null,
信用被定义为decimal?
,但是Math.Abs
函数不允许为空值
有什么想法吗
另外,必须在7.3版上执行此操作,因为您有一个类似于someBool的表达式,所以出现此错误?someDecimal:null,9之前的C#还不能使用赋值目标推断返回类型
decimal?
通常的解决方法是使用可为空的目标类型显式键入任一表达式,即:
someBool ? someDecimal : (decimal?)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中引入的。)问题是,条件的左侧是不可空的
十进制
,而右侧是空
。两者之间没有转换,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
尝试在
Math.Abs
前面添加(十进制?
。这对我很有效,谢谢!您是通过eg EF Core查询内存中的列表还是数据库?为什么要使用这个.Any()
?你可以只写Credit=Math.Abs(x.Sum(y=>y.Credit))
它在我进入公司时已经添加了,但我假设它正在检查是否有任何赋值。我试过做Credit=Math.Abs(x.Sum(y=>y.Credit))
但是页面加载失败。@BojanPetkovski那么你是从数据库查询还是不从数据库查询?如果是,您正在使用哪种ORM?Any()
将产生效率低下的查询。在SQL中,SUM()ABS(SUM(Credit))
会自动返回NULL
。真正的问题可能是如何在EF或EF Core中使用Math.Abs
?应该注意的是,C#9也不能仅从条件中推断出可为空的类型,但是,它可以从目标推断类型,因此,如果将条件表达式分配给可为空的类型,它将工作,但如果将其分配给var
,它将不工作。@juharr:好的一点,我已经澄清了。问题不在于Credit
可为空,这是因为C#9之前的条件不能从目标推断类型,因此不能确定decimal
和null
之间的公共类型。
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