6

これが私のコードです

public interface ITranslator<E, R>
{       
    E ToEntity<T>(R record);
}

class Gens : ITranslator<string, int>
{
    #region ITranslator<string,int> Members

    public string ToEntity<MyOtherClass>(int record)
    {
        return record.ToString();
    }

    #endregion
}

これをコンパイルすると、エラーが発生しますType parameter declaration must be an identifier not a type

なぜ私は持つことができないのに持つことToEntity<MyOtherClass>ができるのですToEntity<T>か??

編集:何をMyOtherClassしていますか?複数のテーブル/クラスのエンティティ (エンティティ フレームワークに相当する POCO) とレコード (フレームワークによって返されるオブジェクト) の間で変換しています。したがって、これを使用してクラス固有の変換を行いたいと思います

4

3 に答える 3

9

インターフェイスには、実装クラスで非ジェネリックにしたジェネリックメソッドToEntity<T>があります。(ジェネリックメソッドは、おそらく特定の制約が与えられた場合、任意の型パラメーターを取ることができます。クラスは、ジェネリックの目的を無効にする型パラメーターのみの定義を提供しようとしています。)GensToEntity<MyOtherClass>TGensToEntity MyOtherClass

コード例では、GensクラスがどのようにMyOtherClass型を使用しようとしているのかが不明です。のロジックに関与していないことは確かですToEntity。さらに詳しい情報が必要です。

説明のために、インターフェースの現在の定義がITranslator<E, R>提供するものを平易な英語で示します。

「 type のレコードを type のエンティティに変換するメカニズムを提供します。Rこのメカニズムは、ユーザーが指定した type に依存します 。」ET

一方、あなたのGensクラスは、現在の設計方法では、上記のインターフェースを次のように「実装」します。

「私は整数を文字列に変換できます。ユーザーが型を指定してこの変換をどのように実行するかを制御できるようにしていますが、実際には型を選択することはできません。MyOtherClassクラスは何らかの形で関与しています。それが私が言えるすべてです。 "

これら 2 つの説明から、インターフェイスが保証するGensことをクラスが実際に行っていないことはITranslator<E, R>明らかです。つまり、メソッドにユーザー指定の型を受け入れようとしませんToEntity。そのため、このコードはコンパイルされません。

于 2010-01-29T23:43:00.440 に答える
2

ジェネリック型で制約を宣言する必要があります。

public string ToEntity<T>(int record) where T : MyOtherClass
于 2010-01-29T23:43:08.453 に答える
1

これは、LINQpad で問題なくコンパイルできます。E、R、または T という名前の型がどこかにあるのではないでしょうか?

ああ、あなたがやろうとしていることはわかります... どこかで MyOtherClass をクラスとして定義していますが、それを ToEntity の型引数として使用しようとしています。MyOtherClass を ToEntity にどの程度正確に関与させたいですか?

于 2010-01-29T23:42:06.607 に答える