我有一个C#方法,它接受一堆参数,所有参数都有默认值。其中一个参数是List。我无法弄清楚如何指定List应该默认为空。这是它的样子:
public static void execute(
String condition = "Unnamed condition",
List<String> messages,
Object actual = null,
Object expected = null)
我无法弄清楚如何指定默认情况下消息应为空。当我进入:
...
List<String> messages = new List<String> ()
...
它抱怨“'messages'的默认参数值必须是编译时常量”。
有什么想法吗?
答案 0 :(得分:9)
由于默认参数值必须是编译时表达式,因此引用类型唯一可接受的默认参数值为null
。
你可以通过超载解决这个问题:
public static void execute(String condition = "Unnamed condition")
{
execute(condition, new List<String>(), null, null);
}
如果参数为null
,则构建列表。如果您必须需要一个列表,并希望将所有null
视为空列表,那么如果他们明确地使用null
进行调用,也可以处理。
public static void execute(String condition = "Unnamed condition",
List<String> messages = null, Object actual = null,
Object expected = null)
{
// if you really want this to be empty if null, can check and assign.
if (messages == null)
{
messages = new List<String>();
}
// your other logic
}
或者,如果消息仅在一个地方使用,则可以使用null-coallescing运算符替换空枚举:
public static void execute(String condition = "Unnamed condition",
List<String> messages = null, Object actual = null,
Object expected = null)
{
// assuming you are using messages once for iteration or something...
foreach(var msg in messages ?? Enumerable.Empty<String>())
...
}
虽然显然一个简单的if-guard可以更有效率。真的取决于你是想把它当作一个空的可枚举或空列表,还是只是绕过逻辑......
答案 1 :(得分:3)
正如错误消息明确指出的那样,您不能将引用类型的任意实例作为默认值
您可以使用的只是文字,const
或null
。
相反,您可以将默认值设置为null
,然后写入
messages = messages ?? new List<string>();
答案 2 :(得分:2)
将messages
默认设置为null
,并在功能正文中检查其null
是否适当处理(或将其替换为new List()
)。< / p>
答案 3 :(得分:2)
编译器在这里唯一接受的是null。如果方便,您的方法将需要测试这种情况并替换空列表:
if(messages==null) {
messages=new List<String>();
}
答案 4 :(得分:1)
编译器告诉你原因:默认参数必须是编译时常量。显然,动态分配和构造的列表不符合该描述。最简单的解决方法是设置默认值null
,然后在您的方法中,如果参数为null
,则创建实际的默认列表。