关于c#:为什么as运算符可以与Nullable< T>?一起使用?

Why can the as operator be used with Nullable<T>?

根据as运算符的文档,as用于在兼容的引用类型之间执行某些类型的转换。因为nullable实际上是一个值类型,所以我希望as不使用它。但是,此代码编译并运行:

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
int? temp = null;
if (temp is int?)
{
    // Do something
}

我猜想这只是引用文档中的一个错误,因为类型必须是可以为空的(即可以为空的类型或引用类型),而不仅仅是引用类型。


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


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