class Program { interface IAnimal { } class Dog : IAnimal { public void say() { Console.WriteLine("ワン"); } } class Cat : IAnimal { } static void Main(string[] args) { IAnimal[] dogs = new IAnimal[1] { new Cat() }; foreach (Dog d in dogs) { d.say(); } } }
C#で上記のコードが普通にコンパイルできます。が、dogsの中身はCat型のインスタンスなので実行時エラーになります。最初抽象型のリストをforeachで回すときに具象型で受け取れるのかと思ったら、以下のコードも通ってしまいました。
class Program { interface IAnimal { } class Dog : IAnimal { public void say() { Console.WriteLine("ワン"); } } class Rabbit { } static void Main(string[] args) { IAnimal[] dogs = new IAnimal[1] { new Dog() }; foreach (Rabbit d in dogs) { } } }
これも、実行時エラー。intとかはさすがにNGにしてくれるのですが、これもコンパイルエラーにしてほしい気がします。基本的な事だったりするのでしょうか……。どちらもObjectを基底に持ってるからいいのよ、ということなのかな。