Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换成十进制?在早期版本的.NET(C#7.3版)中转换为十进制_C#_Type Conversion_Decimal_C# 7.3 - Fatal编程技术网

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

转换成十进制?在早期版本的.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)

所以在搜索了类似的问题后,我没有看到任何结果

不断出现的错误是

功能“目标类型条件表达式”在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)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