겉보기에 올바른 .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
'programing' 카테고리의 다른 글
ViewWillDisposure:보기 컨트롤러가 팝업되는지 또는 하위 보기 컨트롤러를 표시하는지 확인합니다. (0) | 2023.06.10 |
---|---|
Oracle SQL 개발자:실패 - 테스트 실패:네트워크 어댑터에서 연결을 설정할 수 없습니까? (0) | 2023.06.10 |
Postgre의 IN 대 ANY 연산자SQL (0) | 2023.06.10 |
Eclipse C++ : "PATH에서 프로그램 "g++"을 찾을 수 없습니다." (0) | 2023.06.10 |
유형 오류: firebase.storage가 기능하지 않습니다. (0) | 2023.06.10 |