2

我有这个方法

public static void WriteErrorLog(LogEntry logEntry, string method, [Optional, DefaultParameterValue(0)]  int? errorTypeID)

所以我希望我可以调用这样的方法

WriteErrorLog(l, "text");

但我还是得到了 Visual Studio 的错误:(

方法 'WriteErrorLog' 没有重载需要 2 个参数

我错过了什么?

谢谢!

4

5 回答 5

16

你不应该使用[Optional, DefaultParameterValue(0)]. 相反,您应该使用 c 样式的默认参数语法:

public static void WriteErrorLog(LogEntry logEntry, string method, int? errorTypeID = 0)

另外,如果errorTypeId是 a Nullable,那么您不应该使用默认值 benull吗?

public static void WriteErrorLog(LogEntry logEntry, string method, int? errorTypeID = null)
于 2012-06-07T14:34:23.977 回答
6

你的问题是这[Optional]不是你如何使它成为可选的。尝试:

public static void WriteErrorLog(LogEntry logEntry, string method, [Optional, DefaultParameterValue(0)]  int? errorTypeID = null)

可选参数是在 C# 4.0 中添加的,是方法重载的简单替代方案。在引擎盖下,它会在您调用它的地方扩展,包括您给它的默认值。你可以留下[Optional]属性。它一点也不疼。事实上,我不确定它是否有任何作用。如果我不得不猜测它是通过标记可以省略的重载来使重载更易于使用,因为另一个重载为您处理了默认值。

于 2012-06-07T14:34:16.003 回答
3

您需要以这种方式声明可选参数:

public static void WriteErrorLog(LogEntry logEntry, 
    string method, int? errorTypeID = 0)

这将正确编译。

于 2012-06-07T14:36:51.440 回答
0

如果您使用 .NET 4(或更高版本):

public static void WriteErrorLog(LogEntry logEntry, string method, int? errorTypeID = null)

请注意,可空类型的“默认”值是null. 在 C 中,人们通常使用 -1 或 0 作为整数的默认值,这是您可以在 C# 中使用可空值更干净地做的事情。AFAIK 在 Haskell 和其他语言中有类似的东西。

于 2012-06-07T14:40:33.450 回答
0

我不知道为什么它不适合你。我完全按照您键入它们的方式复制了方法参数。我使用 VS2010 和 .NET 4.0。我运行了代码,每次都运行良好。

无论如何,您应该使用 C 风格的默认参数。但是这种方法对我仍然有效。但是,我得到一个红色下划线,并且悬停显示相同的错误。但是当我运行代码时,一切正常。

于 2012-06-07T14:44:31.597 回答