是否存在这两个if语句会产生不同结果的情况?
if(x as X != null)
{
// Do something
}
if(x is X)
{
// Do something
}
编辑:澄清:我知道运营商(一般情况下)和它们的含义有什么区别。问题是,是否存在这两种情况会产生不同结果的情况。
答案 0 :(得分:6)
功能上两个陈述之间没有区别。通常,as
版本用于避免双重类型测试,因为您可以执行以下操作
var local = x as X;
if (local != null) {
// Sweet I have local!
}
VS
if (x is X) {
// This runs the type check yet again
var local = (X)x;
}
如果您在类型测试后实际上没有使用该值,那么只需使用is
版本
答案 1 :(得分:2)
如果x
是非可空类型(或非约束为可空类型的泛型类型),则第一个选项将无法编译;第二个是唯一的选择。
除此之外,它们是相同的。
答案 2 :(得分:2)
是否存在这两个if语句会产生不同结果的情况?
首先,请注意as
使用is
的限制比x is X
更多,因此(x as X) != null
可能会编译as
。例如,is
要求指定的类型是引用类型或可空类型; x is X
也适用于不可为空的值类型。
现在假设(x as X) != null
和E as T
都是有效的表达式。根据C#4.0规范的第7.10.11节,“操作E is T ? (T)(E) : (T)null
产生与(x as X) != null
相同的结果”。如果我们将后一个表达式插入 (x as X) != null
== ((x is X) ? (X)x : null) != null // by the definition of "as"
== (x is X) ? ((X)x != null) : (null != null) // distribute
== (x is X) ? true : false // because (x is X) implies (x != null)
== x is X
,我们就会得到
x is X
如果两者都是有效的表达式,则证明(x as X) != null
和{{1}}是等效的。
答案 3 :(得分:0)
在这种情况下:
if(x as X != null)
{
// Do something
}
您首先尝试将x
转换为类型X
,然后再与null进行比较(即转换是否成功)。
在另一个案例中:
if(x is X)
{
// Do something
}
您只是询问x
是否为X
类型且未进行投射。