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

C# 关于声明泛型嵌套类的编译错误,c#,generics,dictionary,compilation,compiler-errors,C#,Generics,Dictionary,Compilation,Compiler Errors,我得到一个关于这段代码的编译错误: 错误1类、结构或接口成员声明中的无效标记“(” 错误2不能在for、use、fixed或声明中使用多个类型 你知道为什么吗?另外,有没有可能声明字典如下 public class S { private class ObInfo<T> { private string _type; private T _value; public ObInfo

我得到一个关于这段代码的编译错误:

错误1类、结构或接口成员声明中的无效标记“(”
错误2不能在for、use、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>();
}
公共类S
{
私有类ObInfo
{
私有字符串_类型;
私人T_值;
公共ObInfo(字符串i_类型,T值)
{
这个。_type=i_type;
此值为._值=值;
}
公共ObInfo()
{}
}
私有静态字典sObj=新字典();
}
公共ObInfo(…){
构造函数不能接受泛型参数。
卸下
,一切正常

类中的所有方法(和类型)都继承该类的泛型参数;如果泛型类中的方法需要单独的类型参数,则只应在泛型类中创建泛型方法。(应该避免这种情况;这非常容易混淆)


此外,打开的泛型类型实际上不是类型;如果不为
ObjInfo
指定类型参数,则无法拥有
字典

相反,您可以为字典使用非泛型接口,也可以将类型参数移动到外部类并具有一个。

您只需将静态字段放入类中即可。因此,对于泛型类的每个实现,您将具有不同的静态字典

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>>();
       }
}
公共类S
{
私有类ObInfo
{
私有字符串_类型;
私人T_值;
公共ObInfo(字符串i_类型,T值)
{
这个。_type=i_type;
此值为._值=值;
}
公共ObInfo()
{}
私有静态字典sObj=新字典();
}
}

SLaks的回答很好,但要澄清一点:您问的是错误发生的原因,而不是如何修复错误。报告错误是因为编译器推断您打算说:

   private class ObInfo<T>
   {
        public ObInfo<T> SomeMethodNameHere(string i_Type, T Value)
私有类ObInfo
{
public ObInfo SomeMethodNameHere(字符串i_类型,T值)
也就是说,它认为您试图创建一个方法,或者可能是一个字段或事件,并且您键入了返回类型,
ObInfo
,但忘记了方法名称。无论这是一个方法、字段还是事件,
是意外的,因此这就是错误

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

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

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


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

这很快,但是如果我需要将泛型参数传递给c'tor?@JavaSa:请参阅我的第二段。@SLaks:Just T说清楚一点,你提到的这个例子对我来说有点难理解,你的意思是做一些像阿图尔试图做的事情吗?(下面的答案)@SLaks:太好了,现在如果在
类S
中已经有另一个我不能接触的方法,它有类型参数
,也像:
public static void someMethod(){..}
。参考您所说的,S没有类型参数
,这是合法的,怎么可能呢?其次,我提到的方法的
与嵌套类的
无关,所以我应该选择另一个类型参数名称吗?另一种可能的解释是,人们将构造函数视为名称返回类型为
ObInfo
|的ess方法我个人认为使用类名来声明构造函数而不是使用关键字是个坏主意。这会使代码更难阅读,并且会妨碍跨类复制和粘贴构造函数签名。
   private class ObInfo<T>
   {
        public ObInfo<T> SomeMethodNameHere(string i_Type, T Value)