【问题标题】:Why can the as operator be used with Nullable<T>?为什么 as 运算符可以与 Nullable<T> 一起使用?
【发布时间】:2011-10-29 21:36:44
【问题描述】:

根据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 的文档是否错误?我错过了什么吗?

【问题讨论】:

  • Nullable 是一个值类型,我已经更正了你的文字。
  • @Matthew:谢谢。这是一个相当混乱的错字。
  • 关于 AS/IS 和 Nullables 的精彩讨论 - stackoverflow.com/questions/1583050/…

标签: c# nullable autoboxing


【解决方案1】:

这是正确的行为吗?

是的。

as 的文档有误吗?

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

我错过了什么吗?

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

【讨论】:

    【解决方案2】:

    显然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.
    

    【讨论】:

      【解决方案3】:

      来自关于 as 关键字的文档:

      它等价于下面的表达式,只是表达式只计算一次。

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 差不多。如果对象是整数,它会将对象拆箱为整数,然后将其转换为可为空的。如果拆箱失败,那么结果当然是一个可以为 null 的 int。
          【解决方案6】:

          我读到了:

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

          还有拳击转换.....

          【讨论】:

          • 但这不仅仅是简单的装箱,因为它只是一个普通的int被装箱,而int?as的目标。
          • 你为什么认为int?必须从这个问题的角度以不同的方式进行管理?
          • 我不知道为什么不一样。从某种意义上说,这与我要问的有关。
          • 猜测:考虑到msdn.microsoft.com/en-us/library/ms228597.aspx,它确认 Nullable 类型被装箱(就像通常的类型一样)以防万一它不是 Null,在这种情况下,转换的行为就像它与通常的整数一起使用一样。
          猜你喜欢
          • 2022-12-03
          • 2012-02-19
          • 2016-06-28
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 2014-08-06
          • 2019-03-16
          相关资源
          最近更新 更多