虽然听起来就像我们偶尔的愚人节玩笑,C#9正在增加and,or和not它的关键字列表。具体来说,用于模式匹配。
为了使模式匹配更加灵活和强大,C#的设计师希望添加连接,分离和取反模式的概念。从表面上看,它们看起来就像布尔运算,您要在两个模式(合取)上匹配(模式(合取)或在模式上不匹配(取反))。
这就是问题所在。如果使用布尔值,则和
运算符会模棱两可;编译器将无法确定它们是否引用值或模式。为了说明这个想法,请考虑以下分离模式:
if(myBoolistrueorfalse)
这将被解释为“如果myBool等于true或myBool等于false,则为true”。
如果我们使用和
用于组合模式的运算符,然后我们得到以下语法:
if(myBoolistrue
false)
但是该语句已经意味着“如果myBool等于(真或假)的结果为真”。或者简化一下,“如果myBool等于true,则为true”。与上面的析取模式所得到的结果完全不同。
因此,为了避免歧义,必须使用new和or关键字而不是关键字。您可以在Champion中“和,或,而不是模式”中了解有关它们的更多信息。在C#9功能状态下,它们被标记为已合并到master分支中。
经常提出的一个问题是,同一变量是否可以多次声明。例如,
if((e1,e2)is(0,intx)or(intx,0)){M(x);}
在此理论示例中,变量x为e1或e2。这相当于写作,
case(0,intx):case(intx,0):M(x);
实际上,您必须x在两种模式中都声明x才能被明确分配。如果你用下面的代码代替,要么x还是y不会有一个值。
if((e1,e2)is(0,intx)or(inty,0)){M(x);M(y);}
为了解决这个问题,目前的建议是:
在notoror下,可能不会声明模式变量。
在以后的C#版本中可能会重新考虑这一点。
出处: