Ienumerable.cast 到 ValueTuple InvalidCastException

Ienumerable.cast to ValueTuple InvalidCastException

我有一个名为 Point2D 的 class,它有两个属性 XY。此 class 隐式转换为 ValueTuple (double x, double y)

当我使用 Linq Ienumerable.Cast<T>()List<Point2D>() 转换为 List<(double x, double y)>() 时,我的问题来了,它给了我 InvalidCastException

我做错了什么?

编辑:

例子

public class Point2D
{
public Point2D(double x, double y)
{X=x;
Y=y;
}
 public double X {get;}
public double Y {get;}

public static implicit operator (double x, double y) (Point2D point)=> (point.X, point.Y);

public static implicit operator Point2D((double x, double y) point) => new Point2D( point.x, point.y);
}

有 class,所以如果我这样做

var points=new List<Point2D>(){(1,2),(2,3)};

如果我这样做,我会得到强制转换异常

var list = points.Cast<(double x, double y)>().ToList();

定义运算符时,您定义的是自定义 conversion 运算符,而不是 cast 运算符。自定义 conversion 运算符仅在编译时从一种静态类型应用到另一种静态类型(这通常意味着它们不能用于泛型方法)。 "Cast" 可枚举方法仅应用 cast 操作(顾名思义)。

无法创建自定义转换运算符(转换是只有 language/runtime 才能处理的事情)。

如果您将 points.Cast<(double x, double y)>() 更改为 points.Select>(p => ((double x, double y))p),那将改为调用您的自定义转换运算符(尽管所有这些括号看起来很疯狂,但需要转换为命名元组) .