2011-10-24 2 views
1

둘 다 FunctionX라고하는 오버로드 된 메서드가 두 개 있습니다. 그 중 하나는 Boolean 객체를 반환하고, 하나는 Logs라는 미리 정의 된 클래스를 반환합니다.모호한 호출 오류입니다. 두 함수의 반환 유형이 다릅니다.

내가 얻는 오류는 다음과 같습니다. 'FunctionX (string)'및 'FunctionX (string)'메서드 또는 속성간에 호출이 모호합니다.

다른 방법 중 하나에서 Log 객체를 예상하면서 FunctionX (string)를 호출하지만이 오류가 발생합니다. 나는 컴파일러가 리턴 타입을보고 이것을 알아 내야한다고 생각했다. 이 문제를 어떻게 해결할 수 있습니까?

답변

2

Perl 및 Haskell과 같은 언어 은 반환 유형별로 오버로드가 개이지만 대부분의 정적 유형 언어에서는 반환 유형별 함수 오버로드가 지원되지 않습니다. 따라서이 사소한 문제를 코드의 일부로 만들지 않는 것이 좋습니다.

추가 :

Function overloading by return type?

+0

광산을 게시 한 후 SO에 대한이 질문을 Foudnd하십시오. 사람들이 찾을 수 있도록 답변을 올바른 것으로 표시합니다. – Freakishly

2

동일한 서명을 사용하는 함수를 두 개 이상 가질 수는 없습니다. 예 :

string Function1(bool t) 
int Function1(bool t) 

각 기능을 다른 이름으로 부르거나 다른 매개 변수를 사용해야합니다.

string Function1(bool t) 
int Function1(bool t, int g) 
2

다른 반환 유형을 사용하도록 메소드를 오버로드 할 수 없습니다. 컴파일러는 여기서 무엇을 호출해야 하는지를 어떻게 알 수 있습니까?

string Foo() { /* ... */ } 
int Foo() { /* ... */ } 

object f = Foo(); 

언어 디자이너는 계정에 가장 사소한 그뿐만 아니라 사람들을 모든 상황을해야합니다.

+1

우리는 ... 이제 또 다른 예는 – Fischermaen

+0

:-) 잼버리을 모든 권리 보자 : 현재 이전에 유래 토론에서 더 많은 답을 찾을 수 있습니다

동일한 서명을 갖는'void '를 반환하는 두 개의 메소드. –

+0

int 인 경우 int f = Foo(); 그럼 분명하지 않을까요? – Freakishly

2

반환 형식을 제외하고 동일한 메서드 서명이있는 함수를 컴파일러에서 구별 할 수있는 방법은 없습니다. 그리고 내가 아는 한 컴파일러는 강하게 입력 할 수 없습니다. 어떤 방식 으로든 서명을 변경해야합니다. 옵션은 일반 함수를 사용하고 반환 유형을 제공하는 것입니다.

+0

우리는 괜찮습니다 ... 잼버리를 만들어 봅시다 :-) – Fischermaen

0

반환 값이 다른 동일한 서명을 가진 두 개의 함수를 사용할 수 없습니다!

+1

왜 OP에서 외치는거야? :) –

+1

@EdS. 소리 지르는 건 내 의도가 아니 었어. 어쩌면 나는 우연히 느낌표를 사용했다. 나는 비 모국어입니다 ... 불행히도 독일어 :-) – Fischermaen

+0

제 여자 친구는 독일 출신입니다 (미국에서 태어난 몇 세대 전). 그리고 그녀는 언어를 좋아해서, 나는 그것이 불행한 사람. 보통 우리는 소리를 전달하거나 일종의 동요를 전하려고하지 않는 한 느낌표를 사용하지 않습니다. 그다지 중요하지 않은, Danke Shun (초콜릿과 자동차); –

1

반환 형식은 C#에서 오버로드시 사용하지 않습니다. 예를 들어, 당신은 할 수

:

  1. 별도의 기능 FunctionXToLog
  2. FunctionX(string s, out Log logobject)FunctionXToBool를 선언,

FunctionX(string s, out bool value) 그냥 당신에게 힌트를 줄 수 있습니다.

+0

덕분에, 이것은 실제로 "아니오, 당신 수 없습니다!"보다 더 많은 도움이됩니다. 답변 : P – Freakishly

0

메서드의 서명은 해당 이름과 해당 매개 변수의 형식입니다. 반환 유형은 이 아니며 서명의 일부입니다.

따라서 두 가지 방법이 동일한 서명을 가지고 있기 때문에 문제가 발생했습니다. 컴파일러는 호출 할 메서드를 결정하기 위해 반환 유형 또는 할당 할 객체의 유형을 사용하지 않습니다.

원하는 메서드의 클래스 이름을 지정해야합니다 (두 메서드가 서로 다른 클래스에 있다고 가정). 또는 메소드 중 하나에 다른 매개 변수를 제공하여 다른 시그니처를 제공해야합니다. 또는 마지막으로 메서드 중 하나의 이름을 변경하여 모호하지 않게해야합니다.

관련 문제