2014-06-19 53 views
1

我正在使用c#并试图为我的自定义类型常量字段分配逻辑(非空值)。这里是如何。为什么我不能为我的常量字段赋值?

public class Types_of_Accuracy{ 
1 public const Types_of_Accuracy Decimal_Places=Type_of_Accuracy(false); 
2 private bool SD; 
3 public const Types_of_Accuracy Significant_Digits=Type_of_Accuracy(true); 
4 private static Types_of_Accuracy Type_of_Accuracy(bool Significant_digits){ 
5  Types_of_Accuracy TA=new Types_of_Accuracy(); 
6  TA.SD=Significant_digits; 
7  return TA; 
8 } 
} 

当我尝试编译。我得到这些错误。

  • 第1行|'Types_of_Accuracy.Decimal_Places'的类型是'Types_of_Accuracy'。除字符串以外的引用类型的const字段只能用null初始化。 (CS0134)
  • 第3行|'Types_of_Accuracy.Significant_Digits'的类型是'Types_of_Accuracy'。除字符串以外的引用类型的const字段只能用null初始化。 (CS0134)

到目前为止,我最喜欢的解决方案是用下面的代码替换上面的代码。

public class Types_of_Accuracy{ 
1 static Types_of_Accuracy(){ 
2 Decimal_Places.SD=false; 
3 Significant_Digits.SD=true; 
4 } 
5 public const Types_of_Accuracy Decimal_Places=null; 
6 private bool SD; 
7 public const Types_of_Accuracy Significant_Digits=null; 
} 

任何改进将不胜感激。

+3

一个建议:删除下划线并使用[资本骆驼案例](http://en.wikipedia.org/wiki/CamelCase) –

回答

5
  • 常量字段必须用常量值进行初始化。
  • 而且它们必须是值类型或字符串,或者使用null初始化。

Types_of_Accuracy是一个类(引用类型),并且您试图用方法调用来初始化常量,这些常量不是常量。作为一种变通方法,可以作为static readonly代替声明字段:

public static readonly Types_of_Accuracy Decimal_Places = Type_of_Accuracy(false); 
public static readonly Types_of_Accuracy Significant_Digits = Type_of_Accuracy(true); 

这是不完全一样的常数:使用只读字段的值实际上会在运行时读取场,同时采用恒定将取代它在编译时具有它的价值。但在大多数情况下,这种差异并不重要。

2

一个const是一个编译时间常数,引用类型不能在编译时被分配,所以你需要使用一个只读静态字段,而不是在运行时将它们分配

public class Types_of_Accuracy{ 
    public static readonly Types_of_Accuracy Decimal_Places=Type_of_Accuracy(false); 
    private bool SD; 
    public static readonly Types_of_Accuracy Significant_Digits=Type_of_Accuracy(true); 
    private static Types_of_Accuracy Type_of_Accuracy(bool Significant_digits){ 
     Types_of_Accuracy TA=new Types_of_Accuracy(); 
     TA.SD=Significant_digits; 
     return TA; 
    } 
} 
相关问题