有关声明通用嵌套类的编译错误

时间:2012-12-17 15:23:33

标签: c# generics dictionary compilation compiler-errors

我收到有关这段代码的编译错误:

错误1无效的标记'''在类,结构或接口成员声明中 错误2不能在for,using,fixed或declaration中使用多种类型

知道为什么吗?另外,是否可以按如下方式声明字典?

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 个答案:

答案 0 :(得分:7)

public ObInfo<T>(...) {

构造函数不能采用通用参数 删除<T>,一切正常。

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


此外,开放泛型类型实际上不是类型;如果没有为Dictionary<int,ObInfo>指定类型参数,则无法ObjInfo 相反,您可以为字典使用非泛型接口,也可以将type参数移动到外部类并使用separate dictionary per type parameter

答案 1 :(得分:7)

SLaks的答案很好,但澄清一点:你问为什么错误发生了,而不是如何解决它。报告错误是因为编译器推断您打算说:

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

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

显然这不是最好的错误信息,因为它让你感到困惑。最好添加另一种启发式方法来特异性地检测您所处的情况。

我很想知道你为什么犯这个错误。你有没想过:

  • ctor是一个方法,其名称与类名相同,T是类名的一部分。
  • ctor是一种泛型方法,泛型方法必须为其声明一个类型参数。
  • 别的。

如果您认为第一件事:T不是班级名称的一部分。如果您认为第二件事:如果这是真的,那么您将在名为T的范围内声明第二个类型参数,这有点令人困惑,不是吗?

答案 2 :(得分: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>>();
       }
}