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

时间:2014-07-03 00:01:00

标签: 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 = new Point()) { }

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

    static void Main()
    {
        Method1();

        // Method2(); cannot be compiled
    }
}

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

1 个答案:

答案 0 :(得分:2)

它不是编译时常量。您的Point调用是允许的,optional arguemnts可以是:

  • 一个恒定的表达;
  • 新形式ValType()的表达式,其中ValType是值类型,例如枚举或结构;
  • 表单default(ValType)的表达式,其中ValType是值类型。

在这种情况下,您使用第二个允许选项作为可选参数 - 表达式new ValType(),因为struct是值类型。

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