除了普通的Cast
和As
之间的差异外,还有更多。
- 如果我知道apple是一个Fruit,我可以使用
(Fruit)apple
- 如果不是,它会抛出异常 as value
可以检查是否为null以查看是否成功[不会抛出异常...]
然而,我一直在阅读@EricLippert的文章,其中有一个关于可空值类型的好样例:
short? s = (short?)123;
int? i = s as int?;
这段代码不能编译通过...
无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型 "short?" 转换为 "int?"
好的。
那么这个呢:
short? s = (short?)123;
int? i = (int?)s;
编译是否成功?(全然出乎意料!我知道s
不是int?
类型,它应该会挂掉,但它却没有……)
这里的类型转换检查要比前面的例子更加致命(那个例子挂掉了)。
我很抱歉要问这个被讨论得如此频繁的主题。
提前致谢。
as
运算符则不会。 - Yahiaint? i2 = (object)s as int?;
- 实际上返回了null
。 - NSGaga-mostly-inactive(int?)
不会在s
不是int?
时抛出异常。它的工作是在s
不能转换为int?
时抛出异常。有很多情况下,(type)
风格的强制转换可以做一些其他事情,而不仅仅是测试是否拥有该类型(例如,您甚至可以定义自己的类型--http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.100).aspx)。如果您真的想要测试您拥有的是否是类型的实际实例,您应该使用`is`运算符。 - sbloms as int?
,你试图转换s
本身。在第二个例子中,(int?)s
,你取s
的值并尝试转换它。这样讲通了吗? - Mr Listerint i = 123 as int;
,你会得到一个错误,提示为:"The as operator must be used with a reference type ('int' is a value type)"。而int i = (int)123;
则可以完美地编译。 - Mr Lister