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>クラスには implement が必要なので、代わりに実装する必要KがありますIIndexable<K>TestTypeIIndexable<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>、ジェネリックに渡す型が of でなければならないことを意味しますIIndexable<K>

したがって、次のように言うとTreeIndex<TestType>、コンパイラはTestTypeタイプが であると想定しIIndexable<K>、ここでKisを実装TestTypeすることを期待TestTypeしますが、実装IIndexable<TestType>しません。代わりに実装IIndexable<byte>します。


あなたの場合に最適な解決策が何であるかを判断するのは難しいですが、それを解決する1つの方法は、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

制約がジェネリック型パラメーターに適用される場合、具体的な引数から制約の型への暗黙の ID または参照変換が存在する必要があります。このエラーを修正するには

クラスの作成に使用している引数を変更します。

  • クラスの作成に使用している引数を変更します。
  • クラスを所有している場合は、制約を削除するか、何らかの操作を行って暗黙的な参照または ID 変換を有効にすることができます。たとえば、2 番目のタイプに最初のタイプを継承させることができます。

それに基づいて、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>

あなたはそれがTestType実装されていると言っていますIIndexable<TestType>が、これは真実ではありません。

于 2013-09-07T11:50:18.053 に答える