我的测量应用程序有一个继承自Matrix类的Vector类,它公开适用于1D矢量类型矩阵的操作。可以预见,即使底层阵列不是一维的,有人也会尝试将矩阵向下转换为矢量。然后他们不会知道在其中一个Vector操作中发生异常之前会出现问题。但是如果我尝试实现一个演员,即:
public static explicit operator Vector3(Matrix m)
{
if (m.Array.GetLength(0) != 3 && m.Array.GetLength(1) != 1)
throw new InvalidCastException("The matrix dimensions are invalid.");
return new Vector3(m[0, 0], m[1, 0], m[2, 0]);
}
我得到了标题的例外。有什么方法可以避免吗?
答案 0 :(得分:3)
您的类型层次结构存在问题。 Vector
不应该首先从Matrix
继承 - 这是对经典circle/ellipse problem的另一种看法。
此外,在当前层次结构上向Matrix
投射Vector
是向下转发的。向下转换绝不保证安全,因此您的用户应该期望转换可能会失败。即使你不知何故,你也不应试图掩盖这一点。
最后,没有什么可以阻止您提供AsVector3()
方法来完全按照建议的转换运算符执行的操作。