1

次のクラスとメソッドがあります。

public class MyGenericClass<T>
    where T : class
{
}

public class MyClass
{
    public TGen MyMethod<TGen>(TGen myGenClass)
        where TGen : MyGenericClass<T>
        where T : class
    {
        return myGenClass;
    }
}

Tただし、これはMyMethodのシンボルを解決できないため、エラーになります。MyMethod<TGen, T>私には少し冗長に思えるので、持っている必要はありません。これは可能ですか?

4

3 に答える 3

3

T定義で使用する前に指定する必要があります。コンパイラが何が何でTあるかを知る方法はありません。

したがって、T使用する前に指定する必要があります(以下のようにメソッドレベルで、またはおそらくクラスレベルでMyClass):

public class MyClass
{
    public TGen MyMethod<TGen, T>(TGen myGenClass)
        where TGen : MyGenericClass<T>
        where T : class
    {
        return myGenClass;
    }
}

where 句でジェネリック型の具体的な実装を使用することもできます。

public class MyClass
{
    public TGen MyMethod<TGen>(TGen myGenClass)
        where TGen : MyGenericClass<DateTime>
    {
        return myGenClass;
    }
}
于 2012-04-19T16:06:05.710 に答える
2

タイプに応じて任意の MyGenericClass実装を使用できるようにする場合は、使用する実装TGenの基本クラスを作成する必要がありMyGenericClassます(もちろん、これにより、TGenインスタンスで取得する機能が制限されます。

 public class MyGenericClassBase { }
 public class MyGenericClass<T> : MyGenericClassBase { }
 public class MyClass<TGen> 
      where TGen: MyGenericClassBase
 {
     // Stuff
 }
于 2012-04-19T16:08:16.803 に答える
1

Tメソッドのジェネリック型のリストに含めるのを忘れているようです。

public TGen MyMethod<TGen, T>(TGen myGenClass)
    where TGen : MyGenericClass<T>
    where T : class
{
    return myGenClass;
}
于 2012-04-19T16:03:58.520 に答える