“x as X!= null”和“x is X”是否总是返回相同的结果?

时间:2013-12-19 16:37:49

标签: c# .net operators type-conversion comparison-operators

是否存在这两个if语句会产生不同结果的情况?

if(x as X != null)
{
  // Do something
}

if(x is X)
{
  // Do something
}

编辑:澄清:我知道运营商(一般情况下)和它们的含义有什么区别。问题是,是否存在这两种情况会产生不同结果的情况。

4 个答案:

答案 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) != nullE 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类型且未进行投射。