为什么'as'运算符不能用于解析非可空值类型?

5
每个开发者都有自己的标准。一些开发者喜欢使用<type>.TryParse(),一些开发者喜欢使用(type)object;进行类型转换,还有一些开发者喜欢使用关键字。我注意到了'as'操作符的问题 - 它不能用于非空值类型之间的转换。我在MSDN上阅读了关于as关键字的文档,他们也将其解释为“您可以使用as运算符在兼容的引用类型或可空类型之间执行某些类型的转换。” 我用以下代码进行了测试:
                    int i = 0;
                    var k = i as int; //Breaks

                    int i = 0;
                    var k = i as int?; //Works
< p>在这种方式中决定使用as关键字的原因是什么?< /p>

每个开发者都有自己的标准。一些开发者喜欢使用<type>.TryParse(),一些开发者喜欢使用(type)object;进行强制类型转换,还有一些开发者喜欢使用关键字。这适用于开发团队之外的开发者。在团队中开发时,首要的事情是达成共识,制定一个通用的编码规范。 - Sergey Kalinichenko
然而,并非所有的开发人员都在团队中工作。我现在是独自工作的,似乎这个代码库中的所有开发人员都有自己的风格和标准(其中一些让我感到不适)。 - Eon
1
as 的目的是将值转换为特定类型,如果该值适当,并在否则计算为 null 值。请注意其中包含了 null。这个描述对于非可空类型根本不起作用。 - Jon Skeet
2
你不会因为偏好而使用不同的形式 - 你使用不同的形式是因为它们执行不同的操作。例如,as 操作符永远不会调用转换运算符,而 (type)object 可能会这样做。 - Damien_The_Unbeliever
1个回答

9
如果解析失败,as运算符将返回null。由于int是非空值类型,因此您会收到错误信息,而int?Nullable<int>可以容纳null值,这就是为什么您的第二个代码片段有效的原因。
参见:as (C# Reference) 块引用:

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

也来自同一文档链接 块引用:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接