我有一个名为Point2D
的类,它具有两个属性X
和Y
。此类已隐式转换为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();
答案 0 :(得分:1)
在定义运算符时,将定义自定义的 conversion 运算符,而不是 cast 运算符。自定义 conversion 运算符仅在编译时从一种静态类型应用于另一种静态类型(通常意味着它们不能在通用方法中使用)。 “铸造”可枚举方法仅应用 cast 操作(顾名思义)。
不可能创建自定义的强制转换运算符(广播只是一种语言/运行时可以弄乱的东西)。
如果将points.Cast<(double x, double y)>()
更改为points.Select>(p => ((double x, double y))p)
,则将调用您的自定义强制转换运算符(尽管看起来很疯狂,但需要将它们转换为命名元组)。 / p>