可选的C#参数问题

时间:2012-06-07 14:31:26

标签: c#

我有这个方法

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

所以我希望我可以调用像

这样的方法
WriteErrorLog(l, "text");

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

  

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

我缺少什么?

谢谢!

5 个答案:

答案 0 :(得分:16)

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

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

另外,如果errorTypeIdNullable,那么您的默认值是null吗?

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

答案 1 :(得分:6)

你的问题是[Optional]不是你如何选择它。尝试:

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

在C#4.0中添加了可选参数,它是方法重载的简单替代方法。在引擎盖下,它会扩展到您将其调用为包含您提供的默认值的呼叫。您可以保留[Optional]属性。它完全没有伤害。事实上,我不确定它是否有任何作用。如果我不得不猜测是通过标记可以省略的重载来使重载更容易使用,因为另一个重载处理了默认值。

答案 2 :(得分:3)

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

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

这将正确编译。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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