Ienumerable.cast到ValueTuple InvalidCastException

时间:2018-07-12 00:38:01

标签: c# exception valuetuple

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

当我使用List<Point2D>() List<(double x, double y)>()Linq投射到Ienumerable.Cast<T>()时,我遇到了问题,它给了我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);
}

有课程,所以如果我这样做

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

如果执行此操作,我会得到强制转换异常

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

1 个答案:

答案 0 :(得分:1)

在定义运算符时,将定义自定义的 conversion 运算符,而不是 cast 运算符。自定义 conversion 运算符仅在编译时从一种静态类型应用于另一种静态类型(通常意味着它们不能在通用方法中使用)。 “铸造”可枚举方法仅应用 cast 操作(顾名思义)。

不可能创建自定义的强制转换运算符(广播只是一种语言/运行时可以弄乱的东西)。

如果将points.Cast<(double x, double y)>()更改为points.Select>(p => ((double x, double y))p),则将调用您的自定义强制转换运算符(尽管看起来很疯狂,但需要将它们转换为命名元组)。 / p>