0

我四处搜索并找到了一个有点相关的答案,但是,对于我的一生,我仍然无法弄清楚我哪里出错了!我正在尝试使用类似于下面的代码来实现一些通用类型的树数据结构,但我得到编译器错误 CS0311。

错误 CS0311:类型“Test.TestType”不能用作泛型类型或方法“Test.TreeIndex<K>”中的类型参数“K”。没有从“Test.TestType”到“Test.IIndexable<Test.TestType>”的隐式引用转换。

我只是不明白为什么编译器不知道如何处理这个问题,所以任何线索都会非常感激。

public interface IIndexable<K> where K : IComparable
{
    byte[] ToBytes();
    K FromBytes(byte[] bytes);
}

public class TestType : IIndexable<byte>, IComparable
{
    public int CompareTo(object b)
    {
        return 1;
    }

    public byte[] ToBytes()
    {
        return new byte[1];
    }

    public byte FromBytes(byte[] bytes)
    {
        return 0;
    }
}

public class TreeIndex<K> where K : IComparable, IIndexable<K>
{
    public int SomeMethod(K a, K b)
    {
        return a.CompareTo(b);
    }
}

class Program
{
    static void Main()
    {
        TreeIndex<TestType> treeIndex = new TreeIndex<TestType>(); // CS0311 generated twice here
    }
}
4

4 回答 4

3

你的TreeIndex<K>类需要K实现IIndexable<K>,所以TestType应该实现IIndexable<TestType>而不是IIndexable<byte>

public class TestType : IIndexable<TestType>, IComparable
{
    public int CompareTo(object b)
    {
        return 1;
    }

    public byte[] ToBytes()
    {
        return new byte[1];
    }

    public TestType FromBytes(byte[] bytes)
    {
        //...
    }
}

您可能还想考虑IComparable<T>在界面上使用通用约束,IIndexable<K>

public interface IIndexable<K> where K : IComparable<K>
{
    byte[] ToBytes();
    K FromBytes(byte[] bytes);
}
于 2013-09-07T11:49:13.897 回答
0

你告诉编译器做一个new TreeIndex<TestType>()

TreeIndex 的定义TreeIndex<K> where K : IComparable, IIndexable<K>意味着您为泛型传递的类型必须是IIndexable<K>.

所以当你说:TreeIndex<TestType>那么编译器期望TestType是 type IIndexable<K>, where Kis TestType,所以它期望TestType实现IIndexable<TestType>,但它没有。它IIndexable<byte>改为实现。


很难说出最适合您的情况的解决方案是什么,但解决它的一种方法是指定 2 个泛型:

// change the TreeIndex definition to take 2 generic types
public class TreeIndex<K, Y>
    where K : IComparable, IIndexable<Y>
    where Y : IComparable

...

// specify both generic types
TreeIndex<TestType, byte> treeIndex = new TreeIndex<TestType, byte>();
于 2013-09-07T11:52:29.563 回答
0

Compiler Error CS0311

当约束应用于泛型类型参数时,必须存在从具体参数到约束类型的隐式标识或引用转换。纠正这个错误

更改用于创建类的参数。

  • 更改用于创建类的参数。
  • 如果您拥有该类,则可以删除约束或执行某些操作以启用隐式引用或身份转换。例如,您可以使第二种类型继承自第一种类型

基于此,TreeIndex<K>类必须实现IIndexable<TestType>not IIndexable<byte>

当您编写TreeIndex<TestType>编译器时,会询问您的情况是IIndexable<K>什么意思IIndexable<TestType>

但是您的TestType课程没有实现IIndexable<TestType>. 它实现IIndexable<byte>.

于 2013-09-07T11:55:06.947 回答
0

由于您具有以下通用约束

public class TreeIndex<K> where K : IComparable, IIndexable<K>

你在声明 TreeIndex<TestType>

你说的是TestTypeimplements IIndexable<TestType>,这不可能是真的。

于 2013-09-07T11:50:18.053 回答