Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C中的实例访问常量值#_C#_.net_Class_Constants_Getter Setter - Fatal编程技术网

C# 从C中的实例访问常量值#

C# 从C中的实例访问常量值#,c#,.net,class,constants,getter-setter,C#,.net,Class,Constants,Getter Setter,我需要在不知道类的类型的情况下访问该类实例中的const类值,并且能够在类本身上访问它。我该怎么做 我想要实现的示例: public abstract class A { } public class B : A { public const int X = 50; } ... A b = new B(); b.X ??? 这是非常不完整的,但我想要实现的是通过多态性(如果有意义的话)从a型变量访问B的X常量 这是我试图实现这一目标的一种方式: public abstract cla

我需要在不知道类的类型的情况下访问该类实例中的const类值,并且能够在类本身上访问它。我该怎么做

我想要实现的示例:

public abstract class A { }

public class B : A
{
    public const int X = 50;
}
...
A b = new B();
b.X ???
这是非常不完整的,但我想要实现的是通过多态性(如果有意义的话)从a型变量访问B的X常量

这是我试图实现这一目标的一种方式:

public abstract class A
{
    public abstract int X { get; }
}

public class B : A
{
    public const int X = 50;
    public override int X { get { return B.X; } } // or return 50;
}

但问题是C#不会让它编译,因为B中X的定义是重复的。那么我应该怎么做呢?有更好的办法吗?或者,我唯一的选择就是用不同的名称来命名它们?

类似这样的东西应该对您有帮助:

abstract class A
{
    public abstract int X { get ; }
}

class B : A
{
    public override int X { get { return 5 ; } }
}

通过将属性指定为抽象属性,可以强制子类实现只读属性。虽然在类型系统中无法要求具体实现实现抽象属性以使其值不变,但您的具体实现可能会自愿遵守规范。

您想要的可能是静态只读成员:

public abstract class A {
    public static readonly int X=100;
}

public class B: A {
    public static readonly int X=50;
}
看一看。您可以将静态成员视为运行时常量


如果您正在寻找一个可重写常量/静态membe,那么您可能需要查看;这在C#中是不可能的

public override int X{…
方法有什么问题?如果使用
{get{return 50;}
有效。@MAV不,它不起作用,因为B中有X的多个定义。你应该删除
public const int X=50;
,然后只进行覆盖。是的,我不知道你为什么觉得需要const值。这是某种强加的要求吗?我也需要在类上有这个值,这样我就可以像B一样访问它.X.正如我在其他评论中所写,我必须能够访问B类本身上的X。@Sh4rK:你说访问B类本身上的X是什么意思?正如
ClassNameB.X
?@KenKin是的,就像静态变量或常量一样。@Sh4rK:所以你不想用实例访问
X
。@KenKin我想用实例,没有实例。@Sh4rK:你的意思是你想让所有的
A.X
A.X
B.X
B.X
,其中X存在于一个类或一个实例中,并应用于这两个类吗?不,我想
B.X
B.X
@Sh4rK:
B.X
b.X
是不同的;您不能用与非实例成员相同的名称定义实例成员。我将寻找另一种解决方案then@Sh4rK:只需给他们起不同的名字,尽量不要做变通。此问题表示您遇到了设计错误的做法。