为什么运算符的行为类似于==运算符?

时间:2019-11-12 12:43:36

标签: c#

假设我们有这样的声明:

enum EngineType
{
   Gasoline,
   Diesel,
   Electric
}

var engine = EngineType.Electric;

if (engine is EngineType.Electric)
{
    // do something
}

为什么if语句为true。从Microsoft文档: is运算符检查表达式的结果是否与给定类型兼容

EngineType(枚举)的左值类型和整数的右值类型不是吗? 我想念什么吗?

3 个答案:

答案 0 :(得分:2)

因为C#7.0中的is支持模式匹配。特别地,它允许与“恒定模式”匹配。引用from the documentation(强调我的意思):

  

使用常量模式执行模式匹配时,is测试表达式是否等于指定的常量。在C#6和更早版本中,switch语句支持常量模式。从C#7.0开始,is语句也支持它。其语法为:

expr is constant
     

其中 expr 是要评估的表达式,而 constant 是要测试的值。 constant 可以是以下任何常量表达式:

     
      
  • 文字值。

  •   
  • 已声明的const变量的名称。

  •   
  • 枚举常量。

  •   

答案 1 :(得分:2)

由于以这种方式使用is keyword时,实际上是在进行模式匹配(从C#7.0开始):

  

Constant pattern,它测试表达式是否计算为指定的常数值。

答案 2 :(得分:-1)

枚举是完整类型。虽然在内部表示它们,并且可以(隐式吗?)将其转换为整数(它们使用/等于的数字类型可以更改),但是它们每个都是不同的类型。

这实际上启用了所有其他使它们有用的附加类型检查。我们最近有一个问题,为什么我们不仅仅在Enums上使用int常量:

Another enum vs. int

is比较类型和类型。如果您不给它一个类型,它将去查找您给它的类型。使用值原始类型可能会造成歧义。如果1今天是Int16,Int32或Int64,则它是编译器/运行时的详细信息。确实,它可能会随我给出的常数的位数而变化。不是我可以依靠的东西。

它可以恰当地告诉您1.21类型是不同的(除非某些头脑不清的设计师决定在两种情况下都一次使用十进制或浮点值)。

但是类型为EngineType的所有可能的均为类型EngineType。这是Enums首先是事物的重要原因。完全允许进行这种类型的检查。