C# 为什么封装类的结构可以是编译时常量?

C# 为什么封装类的结构可以是编译时常量?,c#,C#,默认参数必须是编译时常量,以便它们可以是内置类型或结构。更准确地说,它们不能是类实例 public class Complex { } public struct Point { public Complex complex; public Point(int any) { complex = new Complex(); } } static class Program { static void Method1(Point p =

默认参数必须是编译时常量,以便它们可以是内置类型或结构。更准确地说,它们不能是类实例

public class Complex { }

public struct Point
{
    public Complex complex;
    public Point(int any)
    {
        complex = new Complex();
    }
}

static class Program
{
    static void Method1(Point p = new Point()) { }

    //static void Method2(Complex c = new Complex()) { } //cannot be compiled

    static void Main()
    {
        Method1();

        // Method2(); cannot be compiled
    }
}

我不明白的是,为什么封装类的结构可以是编译时常量?回想一下,类实例不是编译时常量?

它不是编译时常量。您的点名通话可以是:

  • 恒定的表达式
  • 形式为new ValType()的表达式,其中ValType是值类型,如枚举或结构
  • 默认形式的表达式(ValType),其中ValType是值类型
在本例中,您对可选参数使用了第二个允许选项—一个形式为
new ValType()
的表达式,因为
struct
是一种值类型


您的值类型封装类这一事实并不重要-您将获得值类型的默认值(将
complex
设置为
null
)。

当然我理解这些列表,我不明白的是,为什么结构中的类字段可以使结构成为编译时常量。@FifaEarthCup2014,因为您使用的是结构的默认无参数构造函数,并将所有字段设置为默认值。您不能更改无参数构造函数的实现,因此只能在编译时进行constant@FifaEarthCup2014它不是编译时常量。还有其他允许的选项。@FifaEarthCup2014结构的默认值是允许的可选参数。