Pattern Matching 使用 var 要謹慎

C# Pattern Matching 的一個小細節

近來大家應該都開始用 Pattern Matching 了,這裡邊有一個小細節需要注意。

我們用以下的範例來解釋這個行為,假設我們有一個這樣的方法:

  static void Test(object o)
  {
      if (o is {})
      {
          Console.WriteLine("process o is {}");
      }

      if (o is {} x)
      {
          Console.WriteLine("process o is {} x");
      }

      if (o is object y)
      {
          Console.WriteLine("process o is object y");
      }

      if (o is var z)
      {
          Console.WriteLine("process o is var z");
      }
  }

當使用非 null 值呼叫此方法時,會得到以下結果:

  static void Main(string[] args)
  {
      Test(new object());
  }

結果:

process o is {}
process o is {} x
process o is object y
process o is var z

如果傳入的是 null 呢?

  static void Main(string[] args)
  {
      Test(null);
  }

則會得到這樣的結果:

process o is var z

根據以上的範例,可以得知在前三個評估方式都會評估 o 是否為 null,而使用 var 的時候則不會評估 o 是否為 null; Type Pattern Matching 使用 var 要謹慎。

參考資料:

case 運算式中的 var 宣告

Recursive Pattern Matching