2017-09-12 14 views
0

genericを返すメソッドがintまたはboolまたは他のデータ型を返すことができる方法があるのだろうかと思います。メソッドは型(int、bool、DateTimeなど)としてT(汎用)を返すことはできますか?

private static T GetDefaultValue<T>(SettingType s) 
{ 
    switch(s) 
    { 
    case s.IntValue: 
     return 0; 
    case s.BoolValue: 
     return false; 
    case s.DateTimeValue: 
     return DateTime.MinValue; 
    } 
    return 0; 
} 

などをさらに使用すること:例えば

... 
int x = GetDefaultValue<int>(s.IntValue) 
... 

私は、これは戻り値の型としてオブジェクトを使用して、または過負荷を使用することによって達成することができることを知っているが、それはまた、ジェネリックで動作することができるかどうかさまよいました。

+1

に動作するように、このためにオブジェクトを介してキャストする必要がありますすることができます。しかし、いいえ、ジェネリックスはジェネリック*の問題、すなわち異なるタイプに透過的に適用できる問題を解決するためのものです。 – Groo

+0

デフォルト以外の一般的なパターンは '(T)(object)myValue'です。これは必然的にランタイム変換を伴うので、コンパイル時のジェネリックの安全性の欠如のようなものです。 –

+0

あなたはおそらく 'SettingType'なしで行くことができます:' Type type = typeof(T); type == typeof(int)){/ * do int stuff * /} else if(type == typeof(bool){/ * do bool stuff * /})[など] ' - 悲しいことに' Type' 'switch 'で再生されません。 – Corak

答えて

2

それはしかし、あなたは、コンパイラを少し戦うために持っている、あなたはそれだけで `リターンデフォルト(T)`になります。この場合、

private static T GetDefaultValue<T>(SettingType s) 
{ 
    switch(s) 
    { 
    case s.IntValue: 
     return (T)(object)0; 
    case s.BoolValue: 
     return (T)(object)false; 
    case s.DateTimeValue: 
     return (T)(object)DateTime.MinValue; 
    } 
    throw new NotSupportedException("Unsupported type") 
} 
+0

デフォルトのケースで意味のある例外がスローされると良いでしょう。このようにして、代わりに実行時に 'InvalidCastException'を取得します。 – Groo

+0

@Grooあなたが正しいです、私は元のコードをコピーし、コンパイル可能にしました。私はあなたのフィードバックを反映するために答えを編集しました –