【问题标题】:C# 7.0 case pattern matching on generic parameter泛型参数上的 C# 7.0 案例模式匹配
【发布时间】:2017-11-28 09:23:51
【问题描述】:

是否有不能通过类型模式处理泛型变量的原因?请考虑代码:

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);

【问题讨论】:

  • 您打开的是参数的值,而不是类型。
  • 出于同样的原因right 的演员表需要装箱操作。实际上并没有从任意泛型类型 T 到 Complex 的强制转换。可以向上转换为对象(从而将结构装箱),然后尝试将其拆箱为复杂。在第一种情况下,IComparable&lt;T&gt; 是一个接口,并且总是可以尝试强制转换为一个接口(从而将任何结构装箱)
  • @DavideVitali 与 C# 7 模式匹配,既可以是价值又可以是自然

标签: c# generics switch-statement c#-7.0


【解决方案1】:

这是 C# 7.0 中如何定义模式匹配的结果:要编译您的类型模式,必须存在从 TComplex 的转换,但它不存在。 C# 团队意识到要求这个是错误的,所以this issue was fixed in C# 7.1

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2020-09-02
  • 2014-11-30
相关资源
最近更新 更多