閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

foreachで受け取る型に制限がない?

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を基底に持ってるからいいのよ、ということなのかな。