2013-05-23 10 views
7

私は、メソッドのオーバーロードに対して戻り値の型を異なるものにしたいという状況がありますが、C#ではこれを行うことはできません。C#オーバーロードの戻り値の型 - 推奨される方法

これを処理する最善の方法は何ですか?私のプログラム構造に欠陥があるということが必要だという事実はありますか?

C#でこれが不可能であるという事実を考えれば、推奨されるアプローチは何ですか?

+0

このメソッドは何をしますか? –

+0

データのリストをLinkedListまたはDictionaryとして取得します。 – richard

+0

'var'キーワードの出現により、これは曖昧さなしに実装することは不可能です。 [function-overloading-by-return-type]を参照してください(http://stackoverflow.com/questions/442026/function-overloading-by-return-type) – nawfal

答えて

18

通常、メソッドに異なる名前を付けるだけです。

この例はGetInt32IDataReaderで、GetInt64など

正直に言うと、私は、これは通常、とにかく何をしようとして、それが明確になると考えている - あなたがして ANを呼び出すしている場合は特にオーバーロードされたメソッドの結果は

Console.WriteLine(reader.GetInt32()); // This is clear 

Console.WriteLine(foo.OverloadedGet()); // Which overload of OverloadedGet? 
+1

名前を変更するとそのことが明らかになるため、答えとして受け入れられます私は探していた。 – richard

7

C#でこれが不可能であるという事実を考えると、推奨されるアプローチは何ですか?

これはなぜ必要なのかによって異なります。

最も一般的なアプローチは、別の名前を使用することです。フレームワークは多くの場合、Convert classのようにこれを行います。

あなたは複数のタイプをサポートしたい場合は、あなたが一般的な方法を介してこれを行うことができます:それは、基本クラスの「エンティティ」タイプがあることが一般的ですよう

T SomeMethod<T>() 
    // Optionally add constraints:" 
    where T : IFoo 
{ 

ジェネリックメソッドのアプローチは、repostoriesのための共通です。

2

戻り値の型を指定することができます。

public static T[] Method1<T>(int i, T type) 
{ 
    return new T[i]; 
} 
+0

これが機能するには、 'T type'パラメータはまったく必要ありません。 )あなたがそれを使用していないので、それは必要ありません;) –

+0

@ReedCopseyそれは私に 'string1] Method1(Method 3)を与えることができます。 ); '。 (大したことはありません。私は知っています) – ispiro

+0

@ReedCopseyこのタイプの回答があります。答えるとき、私はちょうどあなたの答えの始まりを見たので、私はそれに気付かなかった。 – ispiro

1

私は既に回答を掲載していますが、別の方法があります:objectを使用してください。

object TheMethod(MyEnum type) 
{ 
    if (type == MyEnum.A) return (object)SubMethod1(); 
    else if (type == MyEnum.B) return (object)SubMethod2(); 
    //... 
} 

int SubMethod1() { return 1; } 
string SubMethod2() { return "a"; } 

結果を適切な型にキャストします。

関連する問題