メソッドのオーバーロードで戻り値の型を変更したいという状況がありますが、C# ではこれを行うことはできません。
これを処理する最良の方法は何ですか? 私がこれを必要とするという事実は、私のプログラム構造に欠陥があることを意味しますか?
これが C# では不可能であるという事実を考えると、推奨されるアプローチは何ですか?
メソッドのオーバーロードで戻り値の型を変更したいという状況がありますが、C# ではこれを行うことはできません。
これを処理する最良の方法は何ですか? 私がこれを必要とするという事実は、私のプログラム構造に欠陥があることを意味しますか?
これが C# では不可能であるという事実を考えると、推奨されるアプローチは何ですか?
通常、メソッドに異なる名前を付けるだけです。
この例はIDataReader
、などGetInt32
です。GetInt64
正直なところ、これにより通常、とにかく何をしようとしているのかが明確になると思います-特に、結果でオーバーロードされたメソッドを呼び出している場合:
Console.WriteLine(reader.GetInt32()); // This is clear
Console.WriteLine(foo.OverloadedGet()); // Which overload of OverloadedGet?
これが C# では不可能であるという事実を考えると、推奨されるアプローチは何ですか?
なぜこれが必要なのかによって異なります。
最も一般的なアプローチは、単に別の名前を使用することです。フレームワークは、 Convert クラスなど、多くの場合にこれを行います。
複数の型をサポートしたい場合は、ジェネリック メソッドを使用してこれを行うことができます。
T SomeMethod<T>()
// Optionally add constraints:"
where T : IFoo
{
ジェネリック メソッド アプローチは、"エンティティ" 型の基本クラスが存在することが一般的であるため、リポジトリでは一般的です。
すでに回答を投稿しましたが、別の方法があります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"; }
そして、結果を適切な型にキャストします。