3

持つ

public interface IGeneric<T>{}

public class Student{}

public class Teacher{}

これは可能です

public class ConcreateClass : IGeneric<Student>, IGeneric<Teacher>{}

これは不可能です

public class GenericClass<T1, T2> : IGeneric<T1>, IGeneric<T2> {}

GenericClass<String, String> instance;2 つのインターフェイスの実装があいまいになるためです。しかし、なぜこれが不可能なのか

public class GenericClassWithTypeConstraints<T1, T2> : IGeneric<T1>, IGeneric<T2>
    where T1 : Student
    where T2 : Teacher
{}

T1 と T2 を同じクラスにすることはできないのでしょうか? (コンパイラエラーは、型制約がない場合と同じです)


"Soner Gönül" を 編集します CS0695は、次のように 2 つのレベルのクラス継承を使用して、回避策を提案しました。

public interface IGeneric<T> { String Name { get; } }

public class Student{}

public class Teacher{}

public class GenericClassBase<T1> : IGeneric<T1>
    where T1 : Student
{ String IGeneric<T1>.Name { get { return "Generic class of Student"; } } }

public class GenericClassDerived<T1, T2> : GenericClassBase<T1>, IGeneric<T2>
    where T1 : Student
    where T2 : Teacher
{ String IGeneric<T2>.Name { get { return "Generic class of Teacher"; } } }

このようなコードは、期待される結果を生成します

GenericClassDerived<Student, Teacher> X = new GenericClassDerived<Student, Teacher>();
Console.WriteLine(((IGeneric<Student>)X).Name); //outputs "Generic class of Student"
Console.WriteLine(((IGeneric<Teacher>)X).Name); //outputs "Generic class of Teacher"
4

1 に答える 1