为什么 C# 的“is”运算符在比较两个布尔值时给出正确的结果,我应该使用它吗?

Pon*_*ian 9 c# c#-7.0

我注意到这个is运算符产生相同的结果,甚至编译出与该运算符相同的结果(请参阅此要点)==。is鉴于我只能在文档中看到与运行时类型测试相关的内容,这是该运算符的正确用法吗?

bool test = false;

if(!test)
{
// some code
}

//OR

if(test is false)
{
// some code
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 20

是的,这是完全有效的——这是一个恒定的模式。从这个意义上来说,它是“正确的”。这不是编译器方面的实现细节或错误。

不过,在语句中以这种方式使用它是相当不传统的if- 常量模式更常用于 switch 语句或表达式中。

但它们并不完全等同。模式匹配is不会在运算符的左侧执行自定义转换is。就拿这个例子来说吧:

using System;
using System.Text;

struct MyBool
{
    public bool Value { get;}
    
    public MyBool(bool value) => Value = value;
    
    public static implicit operator bool(MyBool value) => value;
}

class Test
{
    static void Main()
    {
        MyBool x = new MyBool(true);
        // Valid: uses the implicit conversion from MyBool to bool
        Console.WriteLine(x == true);
        // Invalid
        Console.WriteLine(x is true);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一条语句的错误消息可能有点令人困惑:

错误CS0029:无法将类型“bool”隐式转换为“MyBool”

这是由于这部分恒定模式行为造成的:

当输入值不是开放类型时,常量表达式会隐式转换为匹配表达式的类型;如果输入值的类型与常量表达式的类型不模式兼容,则模式匹配操作会出错。

bool有趣的是,如果添加从to 的转换MyBool,错误会发生变化:

错误 CS0150:需要一个常量值

但从根本上来说,它是无效的。