结构的默认参数

时间:2010-04-20 14:53:49

标签: c# c#-4.0

我有一个像这样定义的函数:

public static void ShowAbout(Point location, bool stripSystemAssemblies = false, bool reflectionOnly = false)

这标志CA1026“替换方法'ShowAbout'带有提供所有默认参数的重载”。我无法执行Point location = new Point(0, 0)Point location = Point.Empty,因为它们都不是编译时常量,因此不能是该函数参数的默认值。所以问题是,如何为结构指定默认参数值?如果不能这样做的话,我可能会在这里用任何理由来压制CA1026。

2 个答案:

答案 0 :(得分:24)

你可以这样做:

public static void ShowAbout(Point location = new Point(), 
    bool stripSystemAssemblies = false,
    bool reflectionOnly = false)

从C#4规范,第10.6.1节:

  

default-argument 中的表达式   必须是以下之一:

     
      
  • 一个常量表达式
  •   
  • new S()形式的表达式,其中S是值类型
  •   
  • default(S)形式的表达式,其中S是值类型
  •   

所以你也可以使用:

public static void ShowAbout(Point location = default(Point),
    bool stripSystemAssemblies = false,
    bool reflectionOnly = false)

编辑:如果你想默认值其他而不是点(0,0),那么值得了解另一个技巧:

public static void ShowAbout(Point? location = null
    bool stripSystemAssemblies = false,
    bool reflectionOnly = false)
{
    // Default to point (1, 1) instead.
    Point realLocation = location ?? new Point(1, 1);
    ...
}

这也可以让调用者明确地说“你通过传入null来选择默认值”。

答案 1 :(得分:1)

AFAICT CA1026表示您应该将其替换为完全不使用默认参数的函数。因此,如图所示更改它仍然会引发违规行为。