2011-10-24 10 views
1

2つのオーバーロードされたメソッドがあります。両方ともFunctionXと呼ばれます。そのうちの1つはBooleanオブジェクトを返し、1つはLogsという事前定義されたクラスを返します。曖昧な呼び出しエラーです。両方の関数の戻り値の型が異なります。

エラーは次のとおりです。「FunctionX(文字列)」と「FunctionX(文字列)」という次のメソッドまたはプロパティ間で呼び出しが曖昧です。

私の他のメソッドの1つでは、Logオブジェクトを期待してFunctionX(string)を呼び出していますが、このエラーが発生しています。私は、コンパイラが戻り値の型を見て、それ自身のためにこれを理解することになっていたと思った。これをどうすれば解決できますか?

答えて

2

PerlおよびHaskellのような言語は、戻り値の型によってオーバーロードされるをサポートしますが、ほとんどの静的型付き言語では、戻り値の型による関数のオーバーロードはサポートされていません。だから、あなたがこの些細な問題をあなたのコードの一部にしていない方が良いでしょう。

追加

Function overloading by return type?

+0

私は私の投稿後、ので、この質問を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

:-)ジャンボリーを行い、すべての権利聞かせている:あなたがここに以前のStackOverflowのディスカッションに多くの答えを見つけることができます

同一の署名を持つ 'void 'を返す2つのメソッド –

+0

intならばf = Foo();それは明らかではないでしょうか? – Freakishly

2

戻り値の型を除いて、同じメソッドシグネチャを持つ関数をコンパイラが区別する方法はありません。そして、私が知る限りコンパイラは強く型付けされることはできません。何らかの形で署名を変更する必要があります。オプションでは、汎用関数を使用して戻り値の型を指定します。

+0

私たちは大丈夫です...ジャンボリーを作ってみましょう:-) – Fischermaen

0

戻り値が異なる同じ署名の2つの関数を使用することはできません。

+1

あなたはなぜOPで叫んでいますか? :) –

+1

@EdS。叫ぶのは私の意図ではありませんでした。たぶん私は偶然、感嘆符を使用しました。私は母国語ではない話者です...残念ながらドイツ語:-) – Fischermaen

+0

私のガールフレンドはドイツ系です(アメリカで生まれた少数の世代)。彼女はその言語を愛しているので、残念です。私たちが本当に叫び声や何らかの扇動を伝えようとしない限り、通常は感嘆符を使用しません。それは本当に重要ではない、偉大なチョコレートと車のためのDanke Shun;) –

1

C#でオーバーロードが発生しても、戻り値の型は宣言されません。

あなたは、たとえばことができます。

  1. はあなたにヒントを与えるために別々の機能FunctionXToLogFunctionXToBool
  2. FunctionX(string s, out Log logobject)FunctionX(string s, out bool value)

を宣言します。

+0

ありがとう、これは実際には "いいえ、あなたはできません!答え:P – Freakishly

0

メソッドのシグネチャは、その名前とそのパラメータの型です。返品のタイプは、であり、署名の一部ではないです。

2つのメソッドが同じシグネチャを持つため、問題が発生しています。コンパイラは、どのメソッドを呼び出すかを決定するために、戻り値の型または割り当てられるオブジェクトの型を使用しません。

2つのメソッドが異なるクラスであると仮定して、必要なメソッドのクラス名を指定する必要があります。あるいは、別のシグネチャを与えるために、メソッドの1つに別のパラメータを指定する必要があります。または、最後に、メソッドの名前を変更して、明瞭にする必要があります。

関連する問題