クラスからインターフェイスへの無効なキャストを試みると、コンパイラはエラーにはなりません(エラーは実行時に発生します)。しかし、抽象クラスに似たようなキャストを試みるとはになります。コンパイラは、それは(一見?)無効だIBAR、にはFooからキャストを拒否しないのはなぜクラスを実装していないインタフェースにクラスをキャストするときにコンパイラエラーが発生しないのはなぜですか?
class Program
{
abstract class aBaz
{
public abstract int A { get; }
}
interface IBar
{
int B { get; }
}
class Foo
{
public int C { get; }
}
static void Main()
{
Foo foo = new Foo();
// compiler error, as expected, since Foo doesn't inherit aBaz
aBaz baz = (aBaz)foo;
// no compiler error, even though Foo doesn't implement IBar
IBar bar = (IBar)foo;
}
}
?または、コンパイラがこの無効なキャストをインターフェイスIBarに許可すると、なぜ抽象クラスに同様の「無効な」キャストが許可されないのですか?aBaz?
http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – SLaks
このキャストは、今晩のお尻で私に会いました。それは傷つく。 –
'Foo'を' sealed'とマークしませんでした。したがって、明示的なキャストはコンパイルされます。 'Foo'から継承したクラスが存在し、さらに' IBar'を実装することもできます。 '密封クラスFoo'を使うと、' IBar'へのキャストはコンパイル時に不正になるでしょう。 (この場合、クラス 'Foo'はprivateにネストされているので、キャストを許さなければならない場合でも、C#コンパイラは_warning_を与えることができますしかし、それはおそらくまれなケースです。)_編集:_これは、以下のAlexeiの対象です。 –