2017-02-17 41 views
-4
public class Program 
{ 
    public readonly string val; // THIS IS AN ERROR? 
    static void Main(string[] args) 
    { 
     // get parameter value 
     if (args.Length>0) 
     { 
      val = args[0]; 

你能告诉我们为什么我编译时会出错吗?在const或readonly变量中放置参数值的最佳方法是什么?无法在主类中声明只读属性?

回答

4

有两点需要注意这里:

  • readonly字段赋值只能出现作为声明 的一部分,或在同一类的构造函数。

  • 您的字段是非静态的,而您的主要功能是静态的。您不能在静态上下文中设置非静态变量。非静态字段需要类的一个实例。

我建议你标记你的领域为静态和值分配给您的变量,你正在声明

下面的代码应该运行

public class Program 
{ 
    public static string val; // THIS IS AN ERROR? 
    static void Main(string[] args) 
    { 
     // get parameter value 
     if (args.Length>0) 
     { 
      Program.val = args[0]; 
+0

它与'Main'函数是静态的有什么关系? 'Program'不是一个静态类。 – wkl

+1

在控制台应用程序中,主要功能是程序的入口点,并由环境调用。可以在不实例化类的对象/实例的情况下调用静态函数。 请参阅语言规范中的第10章:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf –

+0

这很有道理。 – wkl

1

它与它所在的类无关。只需在声明或构造函数中用值初始化它即可。 (因为它是只读的,以后不能分配它。)

public readonly string val = "myString"; 
+0

这其实是不正确的,因为你可以像构造函数中的实例值一样分配'readonly'。 – Andrew

+0

@Andrew确实必须初始化它。但我没有说在构造函数中这也是可能的。相反,我选择了OP代码中最简单的解决方案。但我现在已经编辑了我的答案来说明问题。 – wkl

+0

总是最好给出真正的答案,而不仅仅是一半。 – Andrew

0

您必须立即指定它的值。否则,它怎么可能是“只读?”

0

readonly必须分配给声明或该类的构造函数内。这就是它只读的原因。

也许你最好的选择是这个

public string val {get; private set;} 

这样,它只能从程序类内。