我想访问一个类型的静态字段,这是一个类,在泛型函数中引入。但编译器总是给我这个错误
'T'是'类型参数',即 在给定的上下文中无效
这是代码。
public class A
{
public static int Num = 1;
public int GetClassNum<T>() where T : A
{
//return T.Num;
//return default(T).Num;
//return what???
}
}
public class B : A
{
public static int Num = 2;
}
public class C : A
{
public static int Num = 3;
}
我怀疑这与接口通常用于过滤泛型函数中的typename这一事实有关。还是一定要总是?在这种情况下,不应该有静态字段。我有什么方法可以实现吗?
答案 0 :(得分:1)
试试这个:
public class A
{
private static int _num = 1;
public virtual int Num { get { return _num; } set { _num = value; } }
public int GetClassNum<T>(T input) where T : A
{
return input.Num;
}
}
然后在派生类中重写Num
答案 1 :(得分:1)
静态字段属于类型,而不属于该类型的实例。您不能引用type参数的静态元素,因为它们不是继承的。
使Num不是静态属性:
public class A
{
public virtual int Num
{
get { return 1; }
}
public int GetClassNum<T>(T instance) where T : A
{
return instance.Num;
}
}
public class B : A
{
public override int Num
{
get { return 2; }
}
}
public class C : A
{
public override int Num
{
get { return 3; }
}
}
答案 2 :(得分:1)
您正在做的是错误的,您正在尝试访问类型,而不是实例。
那么如何解决这个问题,
public class A
{
public static int Num = 1;
public int GetClassNum<T>(T inn) where T : A
{
inn.Num //really
}
}
等等,等等......你也不能这样做。因为Num是静态的,我们传递的东西(T inn)是一个对象引用(只有一个类可以访问静态字段,而不是对象)。然后我们怎样才能使这个工作。一种方法是将T作为静态类型,所以
public static class A
{
public static int Num = 1;
public int GetClassNum<T>(T inn) where T : A // Error here
{
inn. /// no Num
}
}
等等,你也不能这样做。因为你不能使用静态实例作为通用约束,因为静态是自己封闭的。
那么如何访问Num,将Num更改为对象实例或参考Preets answer for other option。