20

根据as运营商的文档,as“用于在兼容的引用类型之间执行某些类型的转换”。由于 Nullable实际上是一种类型,我希望as不要使用它。但是,此代码编译并运行:

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

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

4

6 回答 6

21

这是正确的行为吗?

是的。

文档是否错误?

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

我错过了什么吗?

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

于 2011-08-18T17:33:52.697 回答
2

我读:

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

和拳击转换......

于 2011-08-18T15:17:53.027 回答
1

显然, as 运算符的 MSDN 文档需要更新。

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

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

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

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

The as operator must be used with a reference type or nullable type.
于 2011-08-18T16:37:12.763 回答
1

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

于 2011-08-18T15:17:54.383 回答
1

从有关as关键字的文档中:

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

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

is use的引用也说明它适用于引用类型,但是,您也可以执行以下操作:

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

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

于 2011-08-18T15:26:06.203 回答
0

您正在将“as”应用于对象,这是一种引用类型。它可以为 null,在这种情况下,CLR 对将引用“null”拆箱为可空值类型提供特殊支持。任何其他值类型都不支持这种特殊的拆箱,因此,即使 Nullable 是一种值类型,它也确实具有某些特殊的特权。

于 2011-08-18T15:18:08.573 回答