是否有理由不能通过类型模式处理泛型变量?请考虑代码:
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);
答案 0 :(得分:11)
这是如何定义C#7.0中的模式匹配的结果:对于要编译的类型模式,必须存在从T
到Complex
的强制转换,但事实并非如此。 C#团队意识到要求这样做是错误的,所以this issue was fixed in C# 7.1。