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

Jav*_*aSa 4 c# generics dictionary compiler-errors compilation

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

错误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>();
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 7

public ObInfo<T>(...) {
Run Code Online (Sandbox Code Playgroud)

构造函数不能采用泛型参数.
删除<T>,一切都会工作.

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


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


Eri*_*ert 7

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

   private class ObInfo<T>
   {
        public ObInfo<T> SomeMethodNameHere(string i_Type, T Value)
Run Code Online (Sandbox Code Playgroud)

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

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

我有兴趣知道你为什么犯这个错误.你觉得:

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

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