0

在这个例子中假设我们有一个类:

public class Test
{
    int a;
    int b;
    int c;

    public Test(int a = 1, int b = 2, int c = 3)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}

所有参数都是可选的,因此用户可以使用任一实例化类

Test test = new Test(a:a, c:c);

或者用户选择的任何内容,而无需传递所有甚至任何参数。

现在假设我们要添加另一个可选参数StreamWriter sw = new StreamWriter(File.Create(@"app.log"));(我假设这是实例化 StreamWriter 类的正确语法)。

显然,作为必要的论点,我可以将它添加到构造函数中,如下所示:

public Test(StreamWriter sw, int a = 1, int b = 2, int c = 3)

但是,如果我希望它成为可选参数,我该怎么办?以下:

public Test(int a = 1, int b = 2, int c = 3, StreamWriter sw = new StreamWriter(File.Create(@"app.log")))

不是一个选项,因为您收到以下错误:

"Default parameter value for 'sw' must be a compile-time constant"

有没有另一种方法可以在sw不收到此错误的情况下制作可选参数?

4

3 回答 3

2

没有可选参数的方法。您将需要为此使用重载:

public Test(int a = 1, int b = 2, int c = 3)
    : this(new StreamWriter(File.Create(@"app.log")), a, b, c)
{
}

public Test(StreamWriter sw, int a = 1, int b = 2, int c = 3)
于 2013-07-16T17:21:42.967 回答
0

您不能在其中放置必须在运行时评估的表达式。

您可以做的一件事是传入 null,您的函数可以检测到该表达式并将其替换为该表达式。如果它不为空,则可以按原样使用。

于 2013-07-16T17:22:06.803 回答
0

将默认值设为 null 并在构造函数主体中检查 null。

public Test(int a = 1, int b = 2, int c = 3, StreamWriter sw = null)    
{
    if (sw == null)
        sw = new StreamWriter(File.Create(@"app.log"));

    this.a = a;
    this.b = b;
    this.c = c;
}
于 2013-07-16T17:23:23.003 回答