我收到有关这段代码的编译错误:
错误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>();
}
答案 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>
但忘记了方法名称。无论这是方法,字段还是事件,(
都是意外的,因此这就是错误。
显然这不是最好的错误信息,因为它让你感到困惑。最好添加另一种启发式方法来特异性地检测您所处的情况。
我很想知道你为什么犯这个错误。你有没想过:
如果您认为第一件事: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>>();
}
}