我有一个像这样定义的函数:
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。
答案 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表示您应该将其替换为完全不使用默认参数的函数。因此,如图所示更改它仍然会引发违规行为。