web-dev-qa-db-ja.com

ジェネリックパラメーターでのC#7.0ケースパターンマッチング

タイプパターンでジェネリック変数を処理できない理由はありますか?コードを検討してください:

public static int CompareValues<T>(T left, T right)
{
  switch (left)
  {
    case IComparable<T> comparableDif:
      return comparableDif.CompareTo(right);
    case System.Numerics.Complex c:
      return c.Magnitude
        .CompareTo(((System.Numerics.Complex)(object)right).Magnitude);
    default:
      throw new ArgumentException("unsupported type");
  }
}

IComparableインターフェイスの最初の一致は問題ありませんが、2番目の一致はコンパイルされません。このボクシングの回避策を使用する必要があるのはなぜですか?

case object o when o is System.Numerics.Complex:
  return ((System.Numerics.Complex)o).Magnitude
    .CompareTo(((System.Numerics.Complex)(object)right).Magnitude);
13
neonxc

これは、C#7.0でのパターンマッチングの定義方法の結果です。型パターンをコンパイルするには、TからComplexへのキャストが存在する必要がありますが、存在しません。 C#チームは、これを必要とするのは誤りであることを認識したため、 この問題はC#7.1で修正されました

12
svick