为什么as运算符可以与Nullable <t>?</t>一起使用

时间:2011-08-18 15:12:25

标签: c# nullable autoboxing

根据as operator的文档,as“用于在兼容的引用类型之间执行某些类型的转换”。自Nullable is actually a value type以来,我希望as不能使用它。但是,此代码编译并运行:

object o = 7;
int i = o as int? ?? -1;
Console.WriteLine(i); // output: 7

这是正确的行为吗? as的文档是否有误?我错过了什么吗?

6 个答案:

答案 0 :(得分:21)

  

这是正确的行为吗?

  

文档是错误的吗?

是。我已通知文档管理员。感谢您引起我的注意,并为错误道歉。显然,当C#2.0中的语言添加了可空类型时,没有人记得更新此页面。

  

我错过了什么吗?

您可以考虑阅读实际的C#规范而不是MSDN文档;它更明确。

答案 1 :(得分:2)

我看了:

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

和拳击转换.....

答案 2 :(得分:1)

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

答案 3 :(得分:1)

有关 as 关键字的文档:

  

除了表达式仅被计算一次之外,它等效于以下表达式。

     

表达式是什么类型? (type)expression:(type)null

的参考使用也表明它适用于引用类型,但是,您也可以执行以下操作:

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

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

答案 4 :(得分:1)

显然,as operator上的MSDN文档需要更新。

object o = 7;
int i = o as **int** ?? -1;
Console.WriteLine(i);

如果您尝试使用值为int类型的as运算符的以下代码,则会收到相应的编译器错误消息

  

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

虽然社区内容部分the link上有引用的更新:

The as operator must be used with a reference type or nullable type.

答案 5 :(得分:0)

您将'as'应用于Object,这是一种引用类型。它可以为null,在这种情况下,CLR特别支持将引用“null”拆箱为可空值类型。任何其他值类型都不支持此特殊拆箱,因此,即使Nullable是值类型,它也有一些特殊的权限。