';?的使用';在铸造过程中

本文关键字:过程中 | 更新日期: 2023-09-27 18:24:13

我有一段示例代码:

bool _HasParsed;
object IsCheckedAsObj = GetCheckedStatus();
if (IsCheckedAsObj == null)
{
    throw new InvalidOperationException("Status not found");
}
_HasParsed = (bool?)IsCheckedAsObj;    //why (bool?) instead of (bool)

在最后一行中,我可以理解他们正在将对象解析为布尔值。但那是什么在那里干什么?(bool?)和(bool)有什么区别?

';?的使用';在铸造过程中

类型bool?Nullable<bool>的简写。

代码并没有按原样编译。您将收到错误消息"无法将类型"bool?"隐式转换为"bool"。"。

如果您也将变量声明为可为null,它将起作用:

bool? _HasParsed;

当然,这可能意味着您需要对代码进行其他更改。您可以使用_HasParsed.HasValue来检查变量是否为空,并使用_HasParsed.Value来获取布尔值。

bool?Nullable<bool>的简写。不过,您的代码并不需要它,因为在赋值之前需要对null进行检查。

编辑:正如Jeow Li Huan在评论中正确指出的,对null的检查意味着GetCheckedStatus()的返回值属于bool?类型。下面的简化剪报将与OP问题中的原始代码相同:

object IsCheckedAsObj = GetCheckedStatus();
if (IsCheckedAsObj == null)
    throw new InvalidOperationException("Status not found");
bool _HasParsed = (bool)IsCheckedAsObj;

boolbool?之间的区别在于bool?Nullable<bool>,这意味着布尔有三个可能的值:falsetruenull(=未设置)。

bool? nullableBool = null;
if ( b.HasValue )
{
   bool notNullableBool = b.Value;
}

这是MSDN文档。

具有?的类型(如bool?)可以为null。学习如何使用它们。
它也可以表示为CCD_ 20。并且只能应用于struct类型。
Nullable类型的特点是可以将其值或null分配给它们。

使用:

int? number;
// do something with number
if (number.HasValue)
{
  Console.WriteLine(number.Value);
}
else
{
  Console.WriteLine("No value");
}

Console.WriteLine(number.HasValue ? number.Value : "No value");

这意味着它是一个boolean,也可以是null

请参阅MSDN上的Nullable Types。

?是以下结构的简写:

struct Nullable<T> 
{ 
    public bool HasValue; 
    public T Value; 
} 

您可以直接使用此结构,但是?是使生成的代码更加干净的快捷语法。与其键入:Nullable x=新的Nullable(125);

相反,您可以写:int?x=125;

这不适用于字符串,因为字符串是引用类型,而不是值类型。