如何解决泛型错误 CS0311?

How to solve generics error CS0311?

我在网上和 Whosebug 上进行了搜索,发现了很多处理 CS0311 错误的帖子。 None 的场景与我的很接近。我有一个通用 class 继承自通用 class.

请注意 BusinessBaseCSLA 框架中的 class

我错过了什么?

public interface Itest
{
    int Digit();
}

class BB : Itest
{
    public int Digit()
    {
        return 20;
    }
}


class Test<T> : BusinessBase<T>, Itest where T : Test<T>, Itest
{
    public int Digit()
    {
        return 30;
    }
}

Test<Itest> test = new Test<Itest>(); //error CS0311

Error CS0311 The type 'MyTestApp.Itest' cannot be used as type parameter 'T' in the generic type or method 'A<T>'. There is no implicit reference conversion from 'MyTestApp.Itest' to 'MyTestApp.A<MyTestApp.Itest>'. MyTestApp

我同意编译器。 T 在您的场景中是 Itest。您的 where 条件要求 T : Test<T>(听起来很可疑),这将需要 ITest : Test<ITest> ... 但是 ITest 显然没有(也不能): Test<ITest>.

非常不清楚你打算做什么,但我怀疑你的意思是:

class Test<T> where T : Itest

和:

Test<BB> test = new Test<BB>();

你可以这样做:

interface Itest {}

class BusinessBase<T> {

}

class Test<T> : BusinessBase<T>, Itest where T : Test<T>, Itest {
    public int Digit() {
        return 30;
    }
}

class IT : Test<IT>, Itest {

}

class Program {
    public static int Main() {

        var t = new Test<IT>();
        t.Digit();
        return 0;
    }
}

对我来说,泛型的使用非常糟糕,但这就是 CSLA 的工作方式....