无法读取类实例中的const?

Tom*_*try 22 c# const

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

public class UsefulClass
{
    public const String RatingName = @"Ratings\rating";
}

public class OtherClass
{
    public void SomeFunc()
    {
        UsefulClass useful = new UsefulClass();
        String rating = useful.RatingName;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器说,"无法使用实例引用访问静态成员;而是使用类型名称对其进行限定"

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

Bol*_*ock 31

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

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

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

  • 您还可以将常量包装在getter中. (2认同)

Ree*_*sey 14

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

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

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

public class UsefulClass
{
    private const string ratingName = @"Ratings\rating";

    public string RatingName { get { return ratingName; } }
}
Run Code Online (Sandbox Code Playgroud)

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