c#发展

首页 » 常识 » 问答 » C9用于模式匹配的新的and,
TUhjnbcbe - 2020/11/30 15:26:00
北京一般的治疗白癜风多少钱 http://baidianfeng.39.net/a_bdfzyyq/141108/4513569.html

虽然听起来就像我们偶尔的愚人节玩笑,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#版本中可能会重新考虑这一点。

出处:

1
查看完整版本: C9用于模式匹配的新的and,