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
public ObInfo<T>(...) {

构造函数不能接受泛型参数。
删除<T>,一切都会工作。

类中的所有方法(和类型)都继承该类的泛型参数;如果方法需要单独的类型参数,您应该只在泛型类中创建泛型方法。(这应该避免;这很令人困惑)


此外,开放的泛型类型实际上不是类型;如果Dictionary<int,ObInfo>不指定ObjInfo.
相反,您可以为字典使用非泛型接口,或者将类型参数移动到外部类并为每个类型参数设置一个单独的字典

于 2012-12-17T15:24:25.510 回答
7

SLaks 的回答很好,但要澄清一点:您问的是为什么会发生错误,而不是如何修复它。正在报告该错误,因为编译器正在推理您打算说:

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

也就是说,它认为您正在尝试创建一个方法——或者可能是一个字段或事件——并且您输入了返回类型,ObInfo<T>但忘记了方法名称。无论这是方法、字段还是事件,(都是意外的,所以这就是错误。

显然,这可能不是最好的错误信息,因为它让您感到困惑。最好添加另一个启发式来专门检测您所处的情况。

我很想知道你为什么犯这个错误。你认为呢:

  • ctor是与类名同名的方法,T是类名的一部分。
  • ctor 是一个泛型方法,泛型方法必须声明一个类型参数。
  • 别的东西。

?

If you thought the first thing: the T is not part of the class name. If you thought the second thing: if that were true then you'd be declaring a second type parameter in scope called T, which is a little confusing, no?

于 2012-12-17T17:20:07.770 回答
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 回答