根据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
的文档是否有误?我错过了什么吗?
答案 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是值类型,它也有一些特殊的权限。