4

このコードに関してコンパイル エラーが発生します。

エラー 1 クラス、構造体、またはインターフェイス メンバー宣言の無効なトークン '('
エラー 2 for、using、fixed、または宣言で複数の型を使用することはできません

理由はありますか?また、次のようにディクショナリを宣言することはできますか?

public class S
{
        private class ObInfo<T>
        {
            private string _type;
            private T _value;

            public ObInfo<T>(string i_Type, T Value)
            {
                this._type = i_Type;
                this._value = Value;
            }

            public ObInfo() 
               {}
       }

       private static Dictionary<int,ObInfo> sObj= new Dictionary<int,ObInfo>();
}
4

3 に答える 3

7

SLaks の回答は問題ありませんが、1 つの点を明確にするために、エラーを修正する方法ではなく、エラーが発生した理由を尋ねました。エラーが報告されているのは、コンパイラが次のように推論しているためです。

   private class ObInfo<T>
   {
        public ObInfo<T> SomeMethodNameHere(string i_Type, T Value)

つまり、メソッド (またはフィールドまたはイベント) を作成しようとしていると見なされ、戻り値の型を入力しましたObInfo<T>が、メソッド名を忘れました。これがメソッド、フィールド、またはイベントのいずれであって(も、予期しないものであり、それがエラーです。

明らかに、これは可能な限り最良のエラー メッセージではありません。混乱を招くからです。あなたがいる状況を具体的に検出するために別のヒューリスティックを追加する方が良いかもしれません.

なぜあなたがこの間違いを犯したのか知りたいです。あなたは考えましたか:

  • ctor はクラス名と同じ名前のメソッドで、T はクラス名の一部です。
  • ctor はジェネリック メソッドであり、ジェネリック メソッドには宣言された型パラメーターが必要です。
  • 他の何か。

?

最初に考えた場合: T はクラス名の一部ではありません。2 番目のことを考えた場合: それが本当なら、 T という名前のスコープで2 番目の型パラメーターを宣言することになりますが、これは少し混乱しますよね?

于 2012-12-17T17:20:07.770 に答える
7
public ObInfo<T>(...) {

コンストラクターはジェネリック パラメーターを受け取ることができません。
を削除する<T>と、すべてが機能します。

クラス内のすべてのメソッド (および型) は、そのクラスのジェネリック パラメーターを継承します。メソッドが個別の型パラメーターを必要とする場合にのみ、ジェネリック クラス内にジェネリック メソッドを作成する必要があります。(これは避けるべきです。非常に紛らわしいです)


また、オープン ジェネリック型は実際には型ではありません。Dictionary<int,ObInfo>の型パラメータを指定せずに を持つことはできませんObjInfo
代わりに、ディクショナリに非ジェネリック インターフェイスを使用するか、型パラメータを外部クラスに移動して、型パラメータごとに個別のディクショナリを作成できます

于 2012-12-17T15:24:25.510 に答える
1

クラス内に静的フィールドを配置するだけです。したがって、ジェネリッククラスの実装ごとに異なる静的ディクショナリがあります

public class S
{
        private class ObInfo<T>
        {
            private string _type;
            private T _value;

            public ObInfo(string i_Type, T Value)
            {
                this._type = i_Type;
                this._value = Value;
            }

            public ObInfo() 
            {}

           private static Dictionary<int,ObInfo<T>> sObj= new Dictionary<int,ObInfo<T>>();
       }
}
于 2012-12-17T15:32:53.470 に答える