我想这样做:
public int Insert(object o, string[] ignore = new string[] {"Id"})
但它告诉我,我不能这样做? 为什么会这样?
答案 0 :(得分:9)
问题是默认参数必须是常量。在这里,您将动态分配一个数组。与声明const
变量一样,对于引用类型,仅支持字符串文字和空值。
您可以使用以下模式
来实现此目的public int Insert(object o, string[] ignore = null)
{
if (ignore == null) ignore = new string[] { "Id" };
...
return 0;
}
现在,当调用者在调用站点排除参数时,编译器将传递值null
,然后您可以根据需要处理它。请注意,jsut保持简单我已经修改了函数中参数的值,通常不被认为是良好的实践,但我相信在这种情况下这可能没问题。
答案 1 :(得分:6)
引用类型唯一可用的缺省值是null(除了字符串也接受文字),因为它必须在编译时可用。
答案 2 :(得分:3)
最简单的解决方案是使用.Net 1.1方式:
public int Insert(object o)
{
return Insert(o, new String[] { "Id" });
}
public int Insert(object o, String[] s)
{
// do stuff
}
答案 3 :(得分:0)
由于这是一个数组,为什么不使用params
?
public int Insert(object o, params string[] ignore)
{
if (ignore == null || ignore.Length == 0)
{
ignore = new string[] { "Id" };
}
...
然后你可以这样称呼它:
Insert(obj);
Insert(obj, "str");
Insert(obj, "str1", "str2");