这个方法重载有什么问题吗?

问题描述 投票:0回答:2

我试图在我的 Visual Studio 中重载这些方法,但遇到 CS0128 错误,我该怎么做才能修复此代码?

static int Sum(int x, int y) => x + y;
static double Sum(double x, double y) => x + y;
c# methods overloading
2个回答
0
投票

我认为您很可能已经创建了一个新项目并完成了此操作(以及其他代码,但这是相关的部分):

没有意识到(不是你的错,这并不明显),当你这样做时,编译器会通过为你提供一个 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;
}

0
投票

问题在于您使用了顶级语句或更具体地说它们是如何实现的。

文档指出:

如果程序的任何编译单元中存在任何顶级语句,则含义就好像它们组合在全局命名空间中的 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;
}

这个效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.