C# 为什么as运算符可以与Nullable一起使用<;T>;?

C# 为什么as运算符可以与Nullable一起使用<;T>;?,c#,nullable,autoboxing,C#,Nullable,Autoboxing,根据的文档,as“用于在兼容的引用类型之间执行某些类型的转换”。由于可以为null,我希望as不会使用它。但是,此代码编译并运行: object o = 7; int i = o as int? ?? -1; Console.WriteLine(i); // output: 7 这是正确的行为吗?as的文档是否错误?我遗漏了什么吗?我读到: 请注意,as运算符仅执行引用转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行这些转换 和装箱转换…只是一个猜测,

根据的文档,
as
“用于在兼容的引用类型之间执行某些类型的转换”。由于可以为null,我希望
as
不会使用它。但是,此代码编译并运行:

object o = 7;
int i = o as int? ?? -1;
Console.WriteLine(i); // output: 7
这是正确的行为吗?
as
的文档是否错误?我遗漏了什么吗?

我读到:

请注意,as运算符仅执行引用转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行这些转换


和装箱转换…

只是一个猜测,但我要说它将o装箱为整数,然后将其转换为可空值。

您将“as”应用于对象,这是一种引用类型。它可以为null,在这种情况下,CLR特别支持将引用“null”取消绑定到可为null的值类型。任何其他值类型都不支持这种特殊的取消装箱,因此,即使Nullable是一种值类型,它也具有某些特殊的特权。

来自关于as关键字的文档:

它与以下表达式等效,只是该表达式只计算一次

表达式是类型?(类型)表达式:(类型)null

的引用是use还声明它与引用类型一起工作,但是,您也可以执行以下操作:

int? temp = null;
if (temp is int?)
{
    // Do something
}

我猜这只是参考文档中的一个不准确之处,因为类型必须是可空的(即可空的类型或参考类型),而不仅仅是参考类型。

显然,MSDN文档需要更新

object o = 7;
int i = o as **int** ?? -1;
Console.WriteLine(i);
如果您尝试下面的代码,其中使用值类型为int的as运算符,则会得到相应的编译器错误消息

as运算符必须与引用类型或可为null的类型一起使用(“int”是不可为null的值类型)

社区内容部分中有一个更新,其中引用了:

The as operator must be used with a reference type or nullable type.
这是正确的行为吗

的文档是否有误

对。我已经通知了文档经理。谢谢你提醒我这一点,并为错误道歉。显然,在C#2.0语言中添加了可空类型时,没有人记得更新此页面

我错过什么了吗


你可以考虑阅读实际的C语言规范而不是MSDN文档;更明确。

Nullable是一种值类型,我已经更正了您的文本。@Matthew:谢谢。这是一个相当令人困惑的打字错误。关于AS/IS和Nullables的讨论非常好-但这不仅仅是简单的装箱,因为装箱的只是一个普通的
int
,而
int?
AS
的目标。为什么要考虑int?从这个问题的角度来看,必须以不同的方式进行管理?我不知道为什么会有不同。从某种意义上说,这与我的问题有关。猜猜:考虑到哪一个可空类型被装箱(就像通常的类型一样),如果它不是空的话,在这种情况下,强制转换的行为就像它处理通常的整数一样。几乎。如果对象是整数,则将其作为整数解除绑定,然后将其转换为可为null的对象。如果取消装箱失败,那么结果当然是一个null可为null的int。