4

当参数是字典类型时,如何为操作设置默认参数值?

例如:

public void Test(Dictionary<int, bool> dic) {
    ...
}
4

5 回答 5

5

您不能以您想要的方式给它一个默认值,因为它必须是一个编译时常量值,但您可以执行以下操作:

private static bool Test(Dictionary<string, string> par = null)
    {
        if(par == null) par = GetMyDefaultValue();
        // Custom logic here
        return false;
    }
于 2013-10-01T08:05:33.997 回答
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);
}
于 2013-10-01T08:09:13.880 回答
1

您只能用作引用类型null的默认参数值。

默认值必须是以下表达式类型之一:

  • 一个常量表达式;

  • 形式的表达式new ValType(),其中ValType是值类型,例如 anenum或 a struct

  • 形式的表达式default(ValType),其中ValType是值类型。

MSDN

于 2013-10-01T08:02:21.987 回答
0

假设您想null在方法签名中提供非默认值,您无法使用此类型执行此操作。但是,您会立即想到两个替代解决方案。

1,使用带有默认值的可选参数,这必须null用于 a Dictionary(以及除我相信之外的所有其他引用类型string),并且您需要方法内部的逻辑来处理它:

public void Test(Dictionary<int, bool> dictionary = null)
{
    // Provide a default if null.
    if (dictionary == null)
        dictionary = new Dictionary<int, bool>();
}

或者,我会这样做,只需使用“老式”方法重载。这使您可以区分不提供论点的人和提供null论点的人:

public void Test()
{ 
    // Provide your default value here.
    Test(new Dictionary<int, bool>();
}

public void Test(Dictionary<int, bool> dictionary)
{

}

可选参数无论如何都会编译成重载方法,因此它们在语义上几乎相同,只是您希望在哪里表达默认值的偏好。

于 2013-10-01T08:10:31.777 回答
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

于 2013-10-01T08:14:55.200 回答