うわぁポイントはいくつかあって、一番根本的で今更どうしようもないのは変数が透過的に参照になっているところで、アドレスと値を明示的に区別できる言語仕様なら「ポインタと null を比較」は「ポインタの参照先の値をユーザ定義の比較演算子で比較」と混同しようがなかった。
透過的な参照は他にも shallow copy と deep copy の問題とか引数渡しと書き換えの問題とかを発生させる悪しき概念だと思う。
で、次に妙なのが、バインドを伴うパターンマッチと boolean の式としての条件式が同じ書き方をできて、しかもそのバインドのスコープが if を抜けた箇所まで残ってる部分。
if (a.X is not { } x) return;
の後ろまで x が残るのは普通にうわぁとなります (ブロックスコープのない Python かよ……)
たとえば C++ でも if(auto x = hoge) {...} における x のスコープは then 節と else 節の中で済んでいるはずで、「if の条件の形で if 外から参照可能な名前を宣言/定義する」というのは妙じゃないですか?
あー、もしかして early return する if の場合は後続コード全てが暗黙に else 節に入っているというセマンティクスになってる?
なら理解はできるけど、名前の導入くらい重要なことはちゃんと専用の文法を用意しなよと思うわ
まああとオマケで、 ! 演算子が前置と後置の両方で使えるのも x !is not null (本当は x! is not null 相当の解釈をされている) の勘違いが通ってしまう原因なので、そこは記号を変えるなりすべきで前置/後置演算子両方あり (しかも意味は全然違う) みたいな割当は避けるべきだった