当该参数是字典类型时,如何为操作设置默认参数值?
例如:
public void Test(Dictionary<int, bool> dic) {
...
}
答案 0 :(得分:4)
你不能以你想要的方式给它一个默认值,因为它必须是一个编译时常量值,但你可以这样做:
private static bool Test(Dictionary<string, string> par = null)
{
if(par == null) par = GetMyDefaultValue();
// Custom logic here
return false;
}
答案 1 :(得分:4)
您可以使用null
作为特殊情况,就像在其他答案中一样,但如果您仍然希望能够呼叫Test(null)
并且与调用Test()
有不同的行为,那么您必须链过载:
public void Test(Dictionary<int, bool> dic) {
//optional, stops people calling Test(null) where you want them to call Test():
if(dic == null) throw new ArgumentNullException("dic");
...
}
public void Test() {
var defaultDic = new Dictionary<int, bool>();
Test(defaultDic);
}
答案 2 :(得分:1)
您只能将null
用作参考类型的默认参数值。
默认值必须是以下类型的表达式之一:
一个恒定的表达;
表单
new ValType()
,其中ValType
是值类型,例如enum
或struct
;表单
default(ValType)
,其中ValType
是值类型。
答案 3 :(得分:0)
假设您要在方法签名中提供非null
默认值,则不能使用此类型执行此操作。但是,您有两种替代解决方案
立即浮现在脑海中。
1,使用带有默认值的可选参数,对于null
(以及除Dictionary
之外的所有其他引用类型,我必须为string
)并且您将需要内部逻辑处理它的方法:
public void Test(Dictionary<int, bool> dictionary = null)
{
// Provide a default if null.
if (dictionary == null)
dictionary = new Dictionary<int, bool>();
}
或者,以及我的方式,只需使用&#34;老式的&#34;方法重载。这使您可以区分不提供参数的人和提供null
参数的人:
public void Test()
{
// Provide your default value here.
Test(new Dictionary<int, bool>();
}
public void Test(Dictionary<int, bool> dictionary)
{
}
可选参数无论如何编译成重载方法,所以它们差不多 在语义上相同,它只是偏好您希望表达默认值的位置。
答案 4 :(得分:0)
您无法将字典设置为NULL以外的任何其他内容。如果您尝试,例如:
public void Test(Dictionary<int, bool> dic = new Dictionary<string, string> { { "1", "true" }})
或者其他什么,那么你会看到这个错误:
'dic'的默认参数值必须是编译时常量。
因此,在这种情况下,NULL
是您唯一的选择。但是,这样做是没有意义的
public void Test(Dictionary<int, bool> dic = null)
最糟糕的是,无论如何,传入的dic
将是NULL
,如果调用者没有实例化新实例,那么无论如何都无法添加NULL
默认值。