1

ITest2つのタイプまたはのいずれかを許可したい汎用基本クラスがありますIBoldface

私の基本クラスは次のようになります。

public abstract class BaseTestingCollections<T> where T : ITest, IBoldface
{
...
}

それを継承するクラスの1つは次のようになります。

public class TestCollection : BaseTestingCollections<ITest>, ITestCollection
{
...
}

コンパイルすると、次のエラーが発生します。

タイプDomainLogic.ITest'は、ジェネリック型またはメソッド'DomainLogic.BaseTestingCollections'のタイプパラメーター'T'として使用できません。'DomainLogic.ITest'から'DomainLogic.IBoldface'への暗黙の参照変換はありません。

4

4 に答える 4

4

そのようなどちらかまたは両方の制限を行うことはできません (お気づきだと思いますが、コンマは よりも似ています&&) ||。異なる名前の 2 つの異なる抽象クラス (one BaseTestingCollectionsTest<T> where T : ITest、other BaseTestingCollectionsBoldface<T> where T : IBoldface) を作成するか、静的制限を削除して実行時にチェックを入れることができます。または、メンバーを共有する場合は、一方を作成するかITestIBoldface他方を拡張するか、共通のインターフェイスを拡張します。

実行時にチェックする例を次に示します。

public abstract class BaseTestingCollections<T>
{
    public BaseTestingCollections()
    {
        if (!typeof(ITest).IsAssignableFrom(typeof(T)) && !typeof(IBoldface).IsAssignableFrom(typeof(T)))
            throw new Exception();
    }
}
于 2012-06-27T21:49:01.713 に答える
3

さて、あなたはあなたが指定した制約を満足していません。との両方Tを拡張/実装する必要があります。 ITest IBoldFace

制約は、タイプの1つを拡張/実装する必要があることを意味するのではなく、両方を実行する必要があります。型引数が有効であるためには、すべての型制約を満たす必要があります。

詳細については、一般的な制約に関するMSDNを参照してください。

于 2012-06-27T21:47:58.760 に答える
3

独自のジェネリック制約に従って、両方 ITestを実装し、クラス IBoldfaceに適したジェネリック引数である型のみ。BaseTestingCollection

どちらでもない-または、どうしてですか?のみを実装し、メソッドを定義していない のインターフェイスBarからメソッドを呼び出すとどうなりますか? そのようなシナリオに直面したとき、コンパイラは何をすべきでしょうか? ITestTIBoldFaceBar

取るべき合理的な行動はありません。制約は、すべて同時にジェネリック引数に適用されます。

于 2012-06-27T21:48:14.553 に答える
2

このような「どちらか一方」の制約を C# ジェネリックで表現することはできません。ある種の共通の基本インターフェースを使用します。

interface ITestOrBold {}
interface ITest : ITestOrBold {}
interface IBoldface : ITestOrBold {}

class BaseTestingCollections<T> where T : ITestOrBold {}

明らかに、代わりにITestOrBold賢明な抽象化が必要です。

于 2012-06-27T21:49:58.850 に答える