【问题标题】:Why can the 'as' operator not be used to parse non-nullable value types?为什么 'as' 运算符不能用于解析不可为空的值类型?
【发布时间】:2014-08-07 13:03:37
【问题描述】:

每个开发者都有自己的标准。一些开发者喜欢<type>.TryParse(),一些开发者喜欢使用(type)object; 投射,还有一些开发者喜欢使用关键字来代替。

我注意到'as' 运算符出现了问题 - 您不能使用它来执行不可为空的值类型之间的转换。我在 as 关键字上阅读了 MSDN 上的文档,他们还将其解释为“您可以使用 as 运算符在兼容的引用类型或可空类型之间执行某些类型的转换。”

我用以下方法对此进行了测试:

                    int i = 0;
                    var k = i as int; //Breaks

                    int i = 0;
                    var k = i as int?; //Works

决定as关键字以这种方式执行的原因是什么?

【问题讨论】:

  • "每个开发者都有自己的标准。有些开发者喜欢使用 .TryParse(),有些开发者喜欢使用 (type)object; 进行转换,有些开发者喜欢使用关键字来代替。”这适用于开发团队之外的开发人员。在团队中开发时,首先要达成共识的是通用编码标准。
  • 不是所有的开发人员都在一个团队中工作。我从现在的位置独自工作,似乎这个代码库上的所有开发人员都有自己的风格和标准(其中一些让我眼花缭乱:))
  • as 的目的是转换为特定类型如果值合适,否则评估为null 值。请注意其中包含null。该描述根本不适用于不可为空的类型。
  • 您不会因为偏好而使用不同的表单 - 您使用不同的表单是因为它们做不同的事情。例如,as 永远不会调用转换运算符。 (type)object 可以这样做。

标签: c# theory


【解决方案1】:

as 运算符将在解析失败时返回 null。由于int 是不可为空的值类型,因此您会收到错误消息,而int?Nullable<int> 可以保存null 值,这就是您的第二个代码 sn-p 起作用的原因。

见:as (C# Reference)

您可以使用 as 运算符执行某些类型的转换 兼容的引用类型或可为空的类型

也来自同一个doc link

as 运算符类似于强制转换操作。但是,如果转换 不可能,因为返回 null 而不是引发异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 2017-04-19
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2021-10-11
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多