Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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
C# C/.NET3.5中的强制转换如何适用于带有“?”的类型_C#_Linq - Fatal编程技术网

C# C/.NET3.5中的强制转换如何适用于带有“?”的类型

C# C/.NET3.5中的强制转换如何适用于带有“?”的类型,c#,linq,C#,Linq,可能重复: 这是我的代码 public decimal? Get() { var res = ... return res.Count() > 0 ? res.First() : (decimal?) null; } 而这个不起作用 public decimal? Get() { var res = ... return res.Count() > 0 ? res.First() : null; } 给出编译器错误: 错误1无法确定条件表达式的类

可能重复:

这是我的代码

public decimal? Get()
{
    var res = ...
    return res.Count() > 0 ? res.First() : (decimal?) null;
}
而这个不起作用

public decimal? Get()
{
    var res = ...
    return res.Count() > 0 ? res.First() : null;
}
给出编译器错误:

错误1无法确定条件表达式的类型,因为“decimal”和“decimal”之间没有隐式转换


我想知道为什么?有什么想法吗?

错误很明显。两者都有吗?en:该条件运算符的某些部分需要具有相同的类型,或者至少必须隐式转换为相同的类型。并且一个单独的null没有一个好的类型


也许你可以用FirstOrDefault。根据您的res类型,会给出null或0m。

错误非常明显。两者都有吗?en:该条件运算符的某些部分需要具有相同的类型,或者至少必须隐式转换为相同的类型。并且一个单独的null没有一个好的类型


也许你可以用FirstOrDefault。取决于res的类型,它会给出null或0m。

我猜res是一个小数数组,即十进制[]。这可能是因为您已经声明了如下内容:

var res = { 1.0, 2.0, 3.0 };
var res = { 1.0, 2.0, null };
不是这样的:

var res = { 1.0, 2.0, 3.0 };
var res = { 1.0, 2.0, null };
因此,编译器没有理由认为res是一个可为空的小数数组

现在您使用的是三元运算符,它必须始终从两侧返回相同或等效的浇注料类型

但是,由于res.First是一个“decimal”,默认情况下,null是非类型化的,因此它只会使null等同于第一个参数res.First的类型,即decimal。通过强制将null类型化为可空十进制'decimal',实际上是强制编译器首先将res.视为可空十进制

但是,总体而言,更好的解决方案是:

public decimal? Get()
{
    decimal?[] res = ...
    return res.FirstOrDefault();
}

我猜res是一个小数数组,即decimal[]。这可能是因为您已经声明了如下内容:

var res = { 1.0, 2.0, 3.0 };
var res = { 1.0, 2.0, null };
不是这样的:

var res = { 1.0, 2.0, 3.0 };
var res = { 1.0, 2.0, null };
因此,编译器没有理由认为res是一个可为空的小数数组

现在您使用的是三元运算符,它必须始终从两侧返回相同或等效的浇注料类型

但是,由于res.First是一个“decimal”,默认情况下,null是非类型化的,因此它只会使null等同于第一个参数res.First的类型,即decimal。通过强制将null类型化为可空十进制'decimal',实际上是强制编译器首先将res.视为可空十进制

但是,总体而言,更好的解决方案是:

public decimal? Get()
{
    decimal?[] res = ...
    return res.FirstOrDefault();
}

C语言规范第7.13节介绍了这种行为

简而言之,三元运算符中两个表达式的类型必须是*兼容*的,以便编译器确定三元表达式的类型。在这种情况下,考虑的两种类型是

十进制的 无效的 decimal类型是值类型,因此null不能转换为值类型。值null没有关联的类型。这会阻止编译器确定表达式的类型,并导致编译错误


在第一个示例中,第二种类型是decimal?。十进制和十进制之间有转换吗?那么编译器选择十进制?作为类型。

此行为在C语言规范的第7.13节中介绍

简而言之,三元运算符中两个表达式的类型必须是*兼容*的,以便编译器确定三元表达式的类型。在这种情况下,考虑的两种类型是

十进制的 无效的 decimal类型是值类型,因此null不能转换为值类型。值null没有关联的类型。这会阻止编译器确定表达式的类型,并导致编译错误


在第一个示例中,第二种类型是decimal?。十进制和十进制之间有转换吗?那么编译器选择十进制?作为类型。

在第二种情况下,可以使用res.FirstOrDefault

IEnumerable.FirstOrDefault返回集合中的第一个T,如果集合为空,则返回默认值:对于类为null,对于结构为一些默认值,在常见情况下为-0

这等于

public decimal? Get()
{
    var res = ...
    return res.Count() > 0 ? res.First() : default(decimal?);
}

在第二种情况下,可以使用res.FirstOrDefault

IEnumerable.FirstOrDefault返回集合中的第一个T,如果集合为空,则返回默认值:对于类为null,对于结构为一些默认值,在常见情况下为-0

这等于

public decimal? Get()
{
    var res = ...
    return res.Count() > 0 ? res.First() : default(decimal?);
}
离题了,但是

当您只需要知道序列是否包含任何元素时,使用有点毫无意义。计数将在所有元素之间循环,而计数将在到达第一个元素时立即停止:

public decimal? Get()
{
    var res = ...
    return res.Any() ? res.First() : (decimal?)null;
}
或者可能是这样:

public decimal? Get()
{
    var res = ...
    using (var e = res.GetEnumerator())
    {
        return e.MoveNext() ? e.Current : (decimal?)null;
    }
}
离题了,但是

当您只需要知道序列是否包含任何元素时,使用有点毫无意义。计数将在所有元素之间循环,而计数将在到达第一个元素时立即停止:

public decimal? Get()
{
    var res = ...
    return res.Any() ? res.First() : (decimal?)null;
}
或者可能是这样:

public decimal? Get()
{
    var res = ...
    using (var e = res.GetEnumerator())
    {
        return e.MoveNext() ? e.Current : (decimal?)null;
    }
}

总体而言,更好的解决方案是假设res包含可为空的小数,而您已经假设答案开头的情况并非如此。在这个世界上
可能不包含可为空的小数,那么更好的整体解决方案是不正确的。很好的一点-我认为FirstOrDefault将返回一个NULL,但defaultdecimal实际上是0.0M。更好的解决方案总体上假设res包含可为空的小数,而您在回答开始时已经假设了这一点。给定一个res可能不包含可为空的小数的世界,那么更好的总体解决方案是不正确的。重要的一点-我认为FirstOrDefault将返回NULL,但defaultdecimal实际上是0.0M。十进制列表的FirstOrDefault将是0M,无论您是否将值转换为decimal?之后这是一个问题。0M是一个不存在的值,还是0M是列表中的第一个值?十进制列表的FirstOrDefault将是0M,无论您是否将该值强制转换为十进制?之后这是一个问题。0M是一个不存在的值的情况,还是0M是列表中的第一个值?和…和…和…的重复,和…和…和…的重复