Why can the as operator be used with Nullable<T>?
根据
1 2 3 | object o = 7; int i = o as int? ?? -1; Console.WriteLine(i); // output: 7 |
这是正确的行为吗?EDOCX1[0]的文档是否错误?我错过什么了吗?
Is this correct behavior?
对。
Is the documentation for as wrong?
对。我已经通知了文档管理员。谢谢你提醒我,并为这个错误道歉。显然,当C 2.0语言中添加了可为空的类型时,没有人记得更新这个页面。
Am I missing something?
您可以考虑阅读实际的C规范,而不是msdn文档;它更具确定性。
我读到:
注意,as运算符只执行引用转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应使用cast表达式来执行这些转换。
和拳击转换……
显然,AS操作员的msdn文档需要更新。
1 2 3 | object o = 7; int i = o as **int** ?? -1; Console.WriteLine(i); |
如果您在下面的代码中尝试使用值类型为int的as运算符,则会得到相应的编译器错误消息,
The as operator must be used with a reference type or nullable type ('int' is a non-nullable value type)
不过,社区内容部分的链接上有一个更新,引用了:
1 | The as operator must be used with a reference type or nullable type. |
从有关as关键字的文档中:
It is equivalent to the following expression except that expression is evaluated only one time.
expression is type ? (type)expression : (type)null
对is use的引用还声明它与引用类型一起使用,但是,您也可以执行以下操作:
1 2 3 4 5 |
我猜想这只是引用文档中的一个错误,因为类型必须是可以为空的(即可以为空的类型或引用类型),而不仅仅是引用类型。
只是猜测一下,但我会说它将O框选为一个整数,然后将其转换为一个可以为空的值。
您正在将"as"应用于对象,该对象是引用类型。它可以为空,在这种情况下,clr特别支持取消对可为空值类型的引用"null"。任何其他值类型都不支持此特殊取消装箱,因此,即使可以为空的值类型,它也具有某些特殊的特权。