基本的にこれをやりたいです。aaは不正なキャスト例外を引き起こします。
注:oは何でもかまいません。Bではなく、C、D、E、Fなどである可能性があります。ただし、oがAに型キャストできるクラスである限り、これは機能するはずです(Bはそのようなクラスです。暗黙の演算子オーバーロードを使用します)
var b = (B)"sz";
var a = (A)b;
object o = b;
var aa = (A)o;
基本的にこれをやりたいです。aaは不正なキャスト例外を引き起こします。
注:oは何でもかまいません。Bではなく、C、D、E、Fなどである可能性があります。ただし、oがAに型キャストできるクラスである限り、これは機能するはずです(Bはそのようなクラスです。暗黙の演算子オーバーロードを使用します)
var b = (B)"sz";
var a = (A)b;
object o = b;
var aa = (A)o;
次のことをやってみましたか?
[...]
var ee = (A)(B)o;
これが機能し、コードが機能しない理由は、そのような明示的なキャストが静的にコンパイルされるためです。言い換えると(A)o
、コンパイラがオブジェクトからへの明示的なキャストをA
探し、それを見つけられないと言うとき。ただし、それはA
オブジェクトのサブクラスであると判断されるため、キャストは実行時に実行可能である可能性があります。また、インスタンスをタイプのフィールドに実行時にダウンキャストする試みを挿入しますA
。このようなランタイムキャストは、明示的および/または暗黙的な変換とは何の関係もありません。これらは、組み込みの型階層規則に従うだけです。
もう一つの例:
object o = 1.0;
int i = (int)o; //throws InvalidCastException - even though (int)1.0 is OK.