私は、それが曖昧なのか、それとも提供されている追加機能なのかを詳しく調べたいと思っています。
public class Foo
{
public int Bar(){
//code
}
public string Bar(int a){
//code
}
}
これについて経験のある方、異なるパラメータを持つ戻り値の型をオーバーロードするのは悪い習慣だと思いますか?
しかし、オーバーロードが戻り値の型に基づいて行われた場合、なぜこれが機能しないのでしょうか。
public class Foo
{
public int Bar(int a){
//code
}
public string Bar(int a){
//code
}
}
最初にどの関数を呼び出すか、2 番目にどの関数を呼び出すかを決定できないため、 obj.Bar(); を呼び出すと、エラーで終了するはずですが、なぜ最初のコード スニペットの実行が許可されるのかについて、何か考えがある人はいますか。
ベストアンサー1
C#仕様(セクション10.6)では、オーバーロードされたメンバーは戻り値の型のみが異なることはできず、http://msdn.microsoft.com/en-us/library/ms229029.aspx
異なる戻り値の型をサポートするためだけにパラメータを作成することに関するご質問についてですが、個人的には、これは問題に対するひどい解決策だと考えています。コードのメンテナンスが難しくなり、未使用のパラメータは明らかにコードの臭いになります。その場合、メソッドをオーバーロードする必要は本当にあるのでしょうか。それとも、そのクラスに属するのでしょうか。ある戻り値の型から別の戻り値の型に変換するために、何か別のものを作成する必要がありますか。より慣用的な解決策を導き出すために、これらすべてのことを尋ねる必要があります。