gpt4 book ai didi

c# - 为什么这个看似正确的 .NET 代码不能编译?

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

我问的是万一我遗漏了一些明显的东西,但我想我可能偶然发现了 .NET 编译器中的错误。

我在 .NET 解决方案中有两个项目,一个是 Visual Basic,一个是 C#。

C# 代码,由三个具有默认值的重载静态方法组成:

public static class Class1
{

public static void TestFunc(int val1, int val2 = 0)
{
}

public static void TestFunc(int val1 = 0)
{
}

public static void TestFunc(string val1, int val2 = 0)
{
}
}

Visual Basic 代码,调用重载方法之一:

Option Explicit On
Option Strict On
Imports ClassLibrary1

Module Module1
Sub Main()
Dim x As Integer
Class1.TestFunc(x, 0)
End Sub
End Module

编译这段代码会失败,说:

“TestFunc”不明确,因为类“ClassLibrary1.Class1”中存在多种具有此名称的成员。

为什么它会认为这个方法不明确?只有一个 Class1.TestFunc 带有 (int, int) 签名。这是一个错误,还是我遗漏了什么?

最佳答案

最终似乎归结为 C# 如何在您的第一个静态方法中实现可选参数。如果您删除它的默认值,您的解决方案应该可以编译。

public static void TestFunc(int val1, int val2) 
{
}

实际上,在这种情况下,我对 C# 的编译感到有些惊讶。您应该在 C# 中使用可选参数或重载,但不能同时使用两者。例如,您将如何消除以下歧义:

public static void TestFunc(int val1, int val2 = 0)     
{
}

public static void TestFunc(int val1)
{
}

如果我传入以下内容,应该执行这两种方法中的哪一种 - 带有可选参数的方法还是不带第二个参数的第二种方法?

TestFunc(1)

如果您想在 C# 实现中包含可选参数,更好的解决方案是结合第一种和第二种方法并根据需要检查您的默认值:

public static void TestFunc(int val1, int val2 = 0)
{
}

public static void TestFunc(string val1, int val2 = 0)
{
}

请注意,使用此版本,VB 能够消除调用哪个方法的歧义。

关于c# - 为什么这个看似正确的 .NET 代码不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7893779/

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