gpt4 book ai didi

c# - 使用条件/三元 ("?:") 运算符进行转换

转载 作者:IT王子 更新时间:2023-10-29 03:55:52 24 4
gpt4 key购买 nike

我有这段 C# 源代码的摘录:

object valueFromDatabase;
decimal result;
valueFromDatabase = DBNull.Value;

result = (decimal)(valueFromDatabase != DBNull.Value ? valueFromDatabase : 0);
result = (valueFromDatabase != DBNull.Value ? (decimal)valueFromDatabase : (decimal)0);

第一个结果评估抛出一个 InvalidCastException 而第二个则没有。这两者有什么区别?

最佳答案

更新:这个问题是 the subject of my blog on May 27th 2010 .感谢您提出很好的问题!

这里有很多非常令人困惑的答案。让我试着准确地回答你的问题。让我们简化一下:

object value = whatever;
bool condition = something;
decimal result = (decimal)(condition ? value : 0);

编译器如何解释最后一行?编译器面临的问题是条件表达式的类型必须对两个分支保持一致;语言规则不允许您在一个分支上返回 object 而在另一个分支上返回 int。选项是 object 和 int。每个 int 都可以转换为 object 但不是每个 object 都可以转换为 int,因此编译器选择 object。因此这与

decimal result = (decimal)(condition ? (object)value : (object)0);

因此返回的零是一个装箱的 int。

然后您将 int 拆箱为 decimal。将装箱的整数拆箱为十进制是非法的。有关原因,请参阅我关于该主题的博客文章:

Representation and Identity

基本上,您的问题是您表现得好像已分配了十进制转换,如下所示:

decimal result = condition ? (decimal)value : (decimal)0;

但正如我们所见,事实并非如此

decimal result = (decimal)(condition ? value : 0);

意味着。这意味着“将两种选择都变成对象,然后将结果对象拆箱”。

关于c# - 使用条件/三元 ("?:") 运算符进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1171717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com