关于声明泛型嵌套类的编译错误

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>();
}
3个回答

7
public ObInfo<T>(...) {

构造函数不能带有泛型参数。
移除 <T> 然后一切都会正常工作。
类中的所有方法(和类型)都继承了该类的泛型参数;只有在方法需要单独的类型参数时,你应该在泛型类内创建泛型方法。(这应该避免;它非常令人困惑)
同时,开放式泛型类型并不是实际的类型;你无法使用未指定 ObjInfo 的类型参数来创建 Dictionary<int,ObInfo>
相反,你可以为字典使用非泛型接口,或者将类型参数移动到外部类,并拥有一个 每个类型参数的独立字典

那很快,但如果我需要将通用参数传递给构造函数呢? - JavaSa
@JavaSa:请看我的第二段。 - SLaks
@SLaks: 只是为了澄清一下,你提到的例子对我来说有点难以理解主要思想,你是不是想做类似Artur尝试的事情?(以下回答) - JavaSa
@SLaks:太好了,现在如果在Class S中已经有另一个我无法更改的方法,它也有类型参数<T>,例如:public static void someMethod<T>() {..}。根据你所说,S没有类型参数<T>,这是合法的,但是为什么呢? 其次,我提到的方法的<T>与嵌套类的<T>无关,那么我应该选择另一个类型参数名称吗? - JavaSa

7
SLaks的回答很好,但是需要澄清一点:你问的是为什么出现了错误,而不是如何修复它。编译器报告错误是因为它推断你想说的是:
   private class ObInfo<T>
   {
        public ObInfo<T> SomeMethodNameHere(string i_Type, T Value)

也就是说,编译器认为你正在尝试创建一个方法——或者可能是一个字段或事件——并且你已经输入了返回类型ObInfo<T>,但却忘记了方法名。无论这是一个方法、字段还是事件,(都是意外的,所以出现了错误。
显然,这不是最好的错误信息,因为它让你感到困惑。最好添加另一个启发式规则,以特别检测你所处的情况。
我很想知道你为什么会犯这个错误。你是否认为:
  • 构造函数是与类名相同的方法,并且 T 是类名的一部分。
  • 构造函数是一个泛型方法,必须为其声明一个类型参数。
  • 其他原因。
  • 如果你认为第一件事:T 不是类名的一部分。如果你认为第二件事:如果那是真的,那么你将在作用域中声明一个称为 T 的第二个类型参数,这有点令人困惑,不是吗?

    1
    另一个可能的解释是,有人把构造函数看作是一个没有名称的方法,并具有返回类型ObInfo <T> | 就个人而言,我认为使用类名来声明构造函数而不是使用关键字是一个不好的主意。这使得代码更难阅读,并阻碍了在类之间复制和粘贴构造函数签名。 - CodesInChaos

    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>>();
           }
    }
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接