【问题标题】:Why can`t I seem to assign values to my constant fields?为什么我似乎无法为常量字段赋值?
【发布时间】:2014-06-19 22:15:44
【问题描述】:

我正在使用 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;
}

我们将不胜感激任何改进。

【问题讨论】:

标签: c# sharpdevelop


【解决方案1】:
  • 必须使用常量值初始化常量字段。
  • 并且它们必须是值类型,或字符串,或用 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;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 2021-09-14
      相关资源
      最近更新 更多