我注意到这个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:需要一个常量值
但从根本上来说,它是无效的。