programing

겉보기에 올바른 .NET 코드가 컴파일되지 않는 이유는 무엇입니까?

abcjava 2023. 6. 10. 07:55
반응형

겉보기에 올바른 .NET 코드가 컴파일되지 않는 이유는 무엇입니까?

제가 뭔가 명백한 것을 빠뜨린 것이 아닌가 해서 물어봅니다만, 우연히 버그를 발견한 것 같습니다.NET의 컴파일러.

.NET 솔루션에 두 개의 프로젝트가 있습니다. 하나는 비주얼 베이직이고 하나는 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)
    { 
    }
}

오버로드된 메서드 중 하나를 호출하는 시각적 기본 코드:

Option Explicit On
Option Strict On
Imports ClassLibrary1

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

이 코드를 컴파일하면 다음과 같이 실패합니다.

클래스 'ClassLibrary1'에 이 이름을 가진 멤버 종류가 여러 개 있기 때문에 'TestFunc'가 모호합니다.1반입니다.'

왜 이 방법이 모호하다고 보겠습니까?클래스 1은 하나뿐입니다.(int, int) 서명을 사용하여 Func를 테스트합니다.이게 벌레야, 아니면 내가 뭔가를 놓쳤니?

궁극적으로 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는 이 버전을 사용하여 호출할 방법을 명확하게 지정할 수 있습니다.

VB.NET에서 컴파일을 시도하면 다음과 같은 결과를 얻을 수 있습니다.

Sub TestFunc(ByVal val1 As Integer, Optional ByVal val2 As Integer = 0)

End Sub

Sub TestFunc(Optional ByVal val1 As Integer = 0)

End Sub

얻게 될 것입니다Public Sub TestFunc(val1 As Integer, [val2 As Integer = 0])' and 'Public Sub TestFunc([val1 As Integer = 0])' cannot overload each other because they differ only by optional parameters.

따라서 VB.NET은 선택적 매개 변수 오버로드에서 C#보다 더 제한적입니다.

TestFunc는 기본 매개 변수로 인해 모호합니다.TestFunc(x)가 호출되면 단일 파라미터를 사용하여 TestFunc를 호출하는지 아니면 기본 파라미터 2번째 파라미터가 기본값 1인 TestFunc를 호출하는지 확실하지 않습니다.

편집

이 질문이 처음 게시되었을 때 두 가지 모두:

Option Strict On

그리고.

Option Explicit On

질문에 포함되지 않았기 때문에 답이 극적으로 바뀝니다.

질문 편집 전 원본 답변

이유:

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

다음에 대해 모호함:

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

VB.net 은 정수를 문자열로 변환할 수 있습니다.

Visual Basic Language Specification 10에는 다음과 같이 명시되어 있습니다.

선택적 매개 변수가 있는 메소드는 호출자가 전달할 수 있는 매개 변수 집합마다 하나씩 여러 개의 서명을 갖는 것으로 간주됩니다.예를 들어, 다음 방법에는 3개의 해당 서명이 있습니다.

 Sub F(x As Short, _
       Optional y As Integer = 10, _
       Optional z As Long = 20)

그래서 너의TestFunc(int val1, int val2 = 0)VB에 두 개의 서명이 있으며, 이는 와 충돌합니다.TestFunc(int val1)그렇게TestFunc모호합니다.

C# 사양에서 옵션 매개 변수가 여러 서명을 가진 메서드로 처리된다는 내용을 찾을 수 없습니다.당신이 보고 있는 행동으로 볼 때, C#에서 그것들은 다중 서명을 가진 것으로 간주되지 않는다고 가정합니다. 그렇지 않으면 컴파일러 오류가 발생할 것입니다. 이것은 C#에서 유효하다는 것을 의미합니다.C#은 두 가지 모두를 호출할 수 없기 때문에 일부 규칙을 기반으로 호출되는 메서드를 선택할 것입니다.TestFunc(0).

언급URL : https://stackoverflow.com/questions/7893779/why-wont-this-seemingly-correct-net-code-compile

반응형