我试图在我的 Visual Studio 中重载这些方法,但遇到 CS0128 错误,我该怎么做才能修复此代码?
static int Sum(int x, int y) => x + y;
static double Sum(double x, double y) => x + y;
我认为您很可能已经创建了一个新项目并完成了此操作(以及其他代码,但这是相关的部分):
没有意识到(不是你的错,这并不明显),当你这样做时,编译器会通过为你提供一个 Main 方法来包围你的代码来帮助你。你看不到它这样做,它只是这样做:
现在的问题是,你的一些东西违反了 C# 中的编译器规则:你不能有两个本地函数(看起来像方法的东西,在另一个方法的
{ }
括号内声明,并且可用仅在该封闭方法中)具有相同的名称,即使它们的参数不同。
要修复它,请将您的程序扩展为不使用顶级语句的普通程序。您可以通过按 Ctrl + . 并选择“转换为主样式程序”轻松完成此操作:
或者您可以自己添加缺少的类/Main..
然后您可以将本地函数移出 Main 并进入类范围,其中它们允许具有相同的名称和不同的参数:
class Program
{
private static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
//moved from here..
}
int Sum(int x, int y) => x + y; //.. to here, in the class scope, not the Main scope
double Sum(double x, double y) => x + y;
}
问题在于您使用了顶级语句或更具体地说它们是如何实现的。
文档指出:
如果程序的任何编译单元中存在任何顶级语句,则含义就好像它们组合在全局命名空间中的 Program 类的 Main 方法的块体中,如下所示:
partial class Program
{
static async Task Main(string[] args)
{
// statements
}
}
在幕后,编译器(= Roslyn)实际上生成了一个带有
Program
方法的 Main()
类(名称可能不同,仅用于说明)。此外,所有方法都成为该 Main()
方法中的 本地函数,这意味着当您编写这样的程序时:
static int Sum(int x, int y) => x + y;
static double Sum(double x, double y) => x + y;
就像你会这样写:
public class Program
{
public static void Main()
{
static int Sum(int x, int y) => x + y;
static double Sum(double x, double y) => x + y;
}
}
在这里你也会得到同样的错误。 e.因为同一作用域内的局部函数不能具有相同的名称。
为了防止这种情况,您只需确保这些函数实际上是类的成员。
public class Program
{
public static void Main()
{
}
static int Sum(int x, int y) => x + y;
static double Sum(double x, double y) => x + y;
}
这个效果很好。