2

私の測量アプリケーションには、1Dベクトルタイプの行列に適した操作を公開するクラスMatrixから継承するクラスVectorがあります。おそらく、基になる配列が1次元でなくても、誰かが行列をベクトルにダウンキャストしようとします。その後、Vector操作の1つで例外が発生するまで、問題があることを認識しません。しかし、キャストを実装しようとすると、つまり:

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]);
}

タイトルの例外があります。それを回避する方法はありますか?

4

1 に答える 1

3

タイプ階層に問題があります。Vectorそもそもから継承するべきではありません。Matrixこれは、古典的な円/楕円の問題に対する別の見方です。

さらに、現在の階層で aMatrixを aVectorにキャストすることは、ダウンキャストです。ダウンキャストが安全であるとは決して保証されないため、ユーザーはキャストが失敗する可能性があることを予期する必要があります。たとえできたとしても、これを隠蔽しようとするべきではありません。

最後にAsVector3()、提案された変換演算子が行うことを正確に行うためのメソッドを提供することを妨げるものは何もありません。

于 2013-02-25T17:44:27.647 に答える