无法在类实例中读取const?

当编译器抱怨这个时,我有点意外:

public class UsefulClass { public const String RatingName = @"Ratings\rating"; } public class OtherClass { public void SomeFunc() { UsefulClass useful = new UsefulClass(); String rating = useful.RatingName; } } 

编译器说, “无法使用实例引用访问静态成员;而是使用类型名称限定它”

这不是问题, String rating = UsefulClass.RatingName; 工作良好。 我只是好奇这背后的想法是什么? 我有一个带有公共常量的公共类的实例,为什么我不能以这种方式获取数据?

因为常量不是实例成员; 他们与各自的类型有着静态的联系。 以同样的方式,您无法使用实例调用静态方法,您无法使用实例访问类常量。

如果您需要在不知道第一手类型的情况下获得实例的常量,我想您可以根据其类型使用reflection来实现。

如果您尝试添加无法修改但与实例相关的成员,则可能需要只读字段或属性。

标记为const “变量”是编译时构造,而不是实例成员。 您可以像访问静态变量一样访问它:

 public void SomeFunc() { UsefulClass useful = new UsefulClass(); String rating = UsefulClass.RatingName; // Access as if static } 

话虽这么说,我会亲自把它包装成一个属性,如果它的意思是按你所描述的那样使用,就像这样:

 public class UsefulClass { private const string ratingName = @"Ratings\rating"; public string RatingName { get { return ratingName; } } } 

这将使您的语法工作,但也是一个更好的设计,IMO,因为它不公开暴露您的常量。

因为c#中的const隐式是静态类型。 并且由于静态成员只能在类成员上访问而不能在实例上访问,因此const也不能访问。