C# では、環境によって次の型が提供されるシナリオにいます。
public interface IFoo {
}
public abstract class Base {
}
public class Derived : Base, IFoo {
}
public class Arbitrary {
public Base GetBase() { }
}
これに加えて、私が書いたものは次のとおりです。Arbitrary.GetBase()
私のコードでは、常にのインスタンスを返すことを保証できることに注意してくださいDerived
。
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived() {
return (IFoo)base.GetBase();
}
}
ただし、このコードは「タイプ 'Base' を 'IFoo' に変換できません」というメッセージで失敗します。
しかし、私がこれを行うと、うまくいきます:
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived() {
Object baseAsObject = base.GetBase();
return (IFoo)baseAsObject ;
}
}
IFoo にダウンキャストする前に、この Object へのアップキャストが必要なのはなぜですか? 2 つのコードは機能的に同一であり、キャストが無効な場合、後者は実行時に確実にクラッシュします。コンパイラが不平を言う理由がわかりません。