我有这个方法
public static void WriteErrorLog(LogEntry logEntry, string method, [Optional, DefaultParameterValue(0)] int? errorTypeID)
所以我希望我可以调用像
这样的方法WriteErrorLog(l, "text");
但是我得到了Visual Studio的错误:(
方法'WriteErrorLog'没有重载需要2个参数
我缺少什么?
谢谢!
答案 0 :(得分:16)
你不应该使用[Optional, DefaultParameterValue(0)]
。相反,您应该使用c样式的默认参数语法:
public static void WriteErrorLog(LogEntry logEntry, string method, int? errorTypeID = 0)
另外,如果errorTypeId
是Nullable
,那么您的默认值是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风格的默认参数。但这种方法对我来说仍然有用。但是,我得到一个红色下划线,并且悬停显示相同的错误。但是当我运行代码时,一切都按预期工作。