C# 7.0 通用参数上的案例模式匹配
C# 7.0 case pattern matching on generic parameter
是否存在无法通过类型模式处理泛型变量的原因?请考虑代码:
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 接口上的第一个匹配没问题,但第二个不编译。为什么我必须使用这种装箱解决方法?
case object o when o is System.Numerics.Complex:
return ((System.Numerics.Complex)o).Magnitude
.CompareTo(((System.Numerics.Complex)(object)right).Magnitude);
这是 C# 7.0 中模式匹配定义方式的结果:要编译您的类型模式,必须存在从 T
到 Complex
的强制转换,但实际上并不存在。 C# 团队意识到要求这个是错误的,所以 this issue was fixed in C# 7.1.
是否存在无法通过类型模式处理泛型变量的原因?请考虑代码:
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 接口上的第一个匹配没问题,但第二个不编译。为什么我必须使用这种装箱解决方法?
case object o when o is System.Numerics.Complex:
return ((System.Numerics.Complex)o).Magnitude
.CompareTo(((System.Numerics.Complex)(object)right).Magnitude);
这是 C# 7.0 中模式匹配定义方式的结果:要编译您的类型模式,必须存在从 T
到 Complex
的强制转换,但实际上并不存在。 C# 团队意识到要求这个是错误的,所以 this issue was fixed in C# 7.1.