gpt4 book ai didi

c# - 为什么参数会这样?

转载 作者:IT王子 更新时间:2023-10-29 04:30:10 27 4
gpt4 key购买 nike

输出

1

2

null

2

代码

class Program
{
static void Main(String[] args)
{
String s = null;
PrintLength(s);
PrintLength(s, s);
PrintLength(null);
PrintLength(null, null);
Console.ReadKey();
}

private static void PrintLength(params String[] items)
{
Console.WriteLine(items == null ? "null" : items.Length.ToString());
}
}

最佳答案

这是一个相当常见的问题。详见规范7.4.1和7.4.3.1节。

简而言之:带有 params 数组的方法适用于其“正常形式”或“扩展形式”。也就是说,你可以说

PrintLength(new string[] {"hello"}); // normal form
PrintLength("hello"); // expanded form, translated into normal form by compiler.

当给定一个适用于两种形式的调用时,编译器总是选择普通形式而不是扩展形式。

假设每次都适用时我们选择扩展形式。假设你有

void M(params object[] x) {}

如果我们总是选择扩展形式,您实际上如何将空数组传递给这个东西?那是不可能的!

假设你说

M(new object[] { "hello" });

我们总是选择扩展形式。这会做什么?好吧,一个对象数组就是一个对象,所以它会选择扩展形式——它会生成另一个数组,将这个东西包装在数组中,然后传递它!

选择扩展形式而不是正常形式会导致疯狂的结果。始终选择普通形式而不是扩展形式是更明智的做法。

关于c# - 为什么参数会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com