C# で、インターフェースといくつかの具体的な実装がある場合、インターフェースを具体的な型にキャストできますか、それとも具体的な型がインターフェースにキャストされますか?
この場合のルールは何ですか?
ベストアンサー1
Java と C# では、どちらの方向も許可されています。ダウンキャストには明示的なキャストが必要であり、オブジェクトの型が適切でない場合は例外がスローされる可能性があります。ただし、アップキャストには明示的なキャストは必要なく、常に安全に実行できます。
つまり、public interface Animal
この の 2 つの実装と、interface
...があると仮定します。Cat
Dog
Animal meowAnimal = new Cat(); // No cast required
Animal barkAnimal = new Dog(); // No cast required
Cat myCat = (Cat) meowAnimal; // Explicit cast needed
Dog myDog = (Dog) barkAnimal; // Explicit cast needed
Dog myPet = (Dog) meowAnimal; // Will compile but throws an Exception
明示的なキャストをtry
/で囲む必要があります。C# には便利なキーワードがあります:catch
as
Dog myDog = barkAnimal as Dog;
Dog myPet = meowAnimal as Dog;
例外はスローされず、myDog は nonNull になり、myPet は null になります。Java には同等のキーワードはありませんが、常にテストを使用して型の安全性を保つことができます。(" " キーワードは、if を実行し、null を失敗に割り当てるバイトコードを生成しているif (meowAnimal instanceof Dog)
と思います。ただし、.NET には " " と同等のことを実行するバイトコード命令があるかもしれません。)as
is
as