Ienumerable.cast 到 ValueTuple InvalidCastException
Ienumerable.cast to ValueTuple InvalidCastException
我有一个名为 Point2D
的 class,它有两个属性 X
和 Y
。此 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)
,那将改为调用您的自定义转换运算符(尽管所有这些括号看起来很疯狂,但需要转换为命名元组) .
我有一个名为 Point2D
的 class,它有两个属性 X
和 Y
。此 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)
,那将改为调用您的自定义转换运算符(尽管所有这些括号看起来很疯狂,但需要转换为命名元组) .