使用'?'在铸造期间

时间:2012-02-13 12:51:44

标签: c# c#-4.0 casting

我有一段代码示例:

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

在最后一行中,我可以理解他们正在将对象解析为boolean。那是什么'?'在那里? (bool?)而不是(bool)之间的区别是什么?

6 个答案:

答案 0 :(得分:5)

bool?类型是Nullable<bool>的缩写。

代码不能按原样编译。您将收到错误消息“无法隐式转换类型'bool?' 'bool'。“。

如果您将变量声明为可为空,那么它将起作用:

bool? _HasParsed;

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

答案 1 :(得分:4)

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;

答案 2 :(得分:1)

boolbool?之间的区别在于bool?Nullable<bool>,这意味着bool有三个可能的值:false,{{1 }和true(=未设置)。

null

Here是MSDN文档。

答案 3 :(得分:1)

?的类型,例如bool?nullable。了解如何use them
它也可以表示为Nullable<bool>。并且只能应用于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");

答案 4 :(得分:0)

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

请参阅Nullable Types on MSDN

答案 5 :(得分:0)

?是下面结构的简写:

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

你可以直接使用这个结构,但是?是使结果代码更清晰的快捷语法。而不是键入:     Nullable x = new Nullable(125);

相反,你可以写:     诠释? x = 125;

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