和 Visual Basic、Visual C++ 或者 Delphi 一样,C# 声明可选参数的方法就是在方法参数声明后面加上参数的默认值。

例如,下面的代码声明了可选参数。
  1: void Foo1(int a, int b = 1);
  2: void Foo2(int a, string b, int c = 0);
  3: string Foo3(string a, string b = "any", Version c = new Version());

和其他语言一样,可选参数必须从右到左出现在参数列表中,也就是说可选参数要么是最后一个,要么右边(下一个参数)也是可选参数。

这些声明是非法的。

  1: // Optional parameter does not appear to the right side.
  2: void Foo1(int a = 0, int b);
  3: // Optional parameter type mismatch.
  4: void Foo2(int b = default(double))

 在代码中这样调用带有可选参数的函数。

 

可见,可选参数的赋值需要使用命名参数。命名参数是指在调用带有可选参数函数时,通过参数名称直接对对应的参数赋值的方法。这在可选参数函数调用时可以大大简化语法。

在上面的例子中,我们需要注意,Foo 函数最少需要 2 个非可选参数值。如果将最后一个函数调用 Foo(a: 1, c: 2, b: 1) 改成 Foo(a: 1, c: 2),那么编译器会报告一个缺少参数的错误,如图。

 

同样的,不能像 Visual Basic 那样省略参数列表,例如,要为可选参数 e 指定值,不能用这样的语句:Foo(1, 2, , , new Version()),而必须通过命名参数来解决此问题(上图中的第 4 个函数调用)。