C#7.0案例模式匹配泛型参数

neo*_*nxc 13 c# generics switch-statement 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");
  }
}
Run Code Online (Sandbox Code Playgroud)

IComparable接口上的第一个匹配是可以的,但第二个匹配不编译.为什么我必须使用这个拳击解决方法?

case object o when o is System.Numerics.Complex:
  return ((System.Numerics.Complex)o).Magnitude
    .CompareTo(((System.Numerics.Complex)(object)right).Magnitude);
Run Code Online (Sandbox Code Playgroud)

svi*_*ick 12

这是一个模式是如何匹配在C#7.0中定义的结果:你的类型模式来编译,从铸造TComplex必须存在,但事实并非如此.C#团队意识到要求这样做是错误的,因此这个问题已在C#7.1中得到修复.