gpt4 book ai didi

C# 和可变数量的参数

转载 作者:行者123 更新时间:2023-11-30 14:44:15 27 4
gpt4 key购买 nike

我尝试了以下代码:

class Program: ProgParent
{

public int Max(params int[] op)
{
return 0;
}

public int Max(int i, params int[] op)
{
return 1;
}

public int Max(int i, int j, params int[] op)
{
return 2;
}

public static void Main(string[] args)
{
System.Console.WriteLine((new Program()).Max(5, 6, 7, 8));
System.Console.ReadKey();
}
}

它执行并使用可用的最具体的函数。但是编译器对此没有给出警告或错误。为什么?

最佳答案

C# 语言规范说:

When performing overload resolution, a method with a parameter array may be applicable either in its normal form [i.e. passing an array] or its expanded form [i.e. passing a variable number of parameters]. The expanded form of a method is available only if the normal form of the method is not available and only if a method with the same signature as the expanded form is not already declared in the same type"

简而言之(稍微简化):如果重载决策不明确,编译器会选择非参数重载。

我想这个决定的原因(而不是让像你这样的代码非法)包括:

  • 如果您的方法具有签名:void fn(params object[] p),您希望有某种方式来调用“正常形式”(通过传递对象[])。因此,编译器无论如何都必须处理模棱两可的情况。
  • 创建一个临时数组比方法调用要昂贵得多,因此您可能希望创建具有 1、2、3 个参数的非参数重载,这些参数的行为相同但效率更高。 (例如 String.Format)

关于C# 和可变数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/700335/

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