次のようなコードがあります:(この質問には役立たないため、メソッドを削除しました)
public abstract class A { }
public interface I { }
public class C : A , I { }
public class Program
{
static void Update<T>(List<T> l,A a,I i,C c)
{
l.Add((T)a);//Error
l.Add((T)i);
l.Add((T)c);//Error
}
}
キャストは、抽象クラスと具象クラスのコンパイル時に失敗しますが、インターフェースでは失敗します。
コンパイラをだますようなことができることは知っていl.Add((T)(object)a);
ますが、インターフェイスを T にキャストすることがなぜ機能するのか理解できません (すべてがうまくいかなかった場合、ある種の型チェックエラーと見なすことができます)。
Javaで試してみましたが、すべて動作します。
public static <T> void update(List<T> l,C c,I i,A a){
l.add((T)c);//ok
l.add((T)i);//ok
l.add((T)a);//ok
}
それは、C#コンパイラのやり方が原因なのか、それともOOPの概念が欠けているからですか?