2012-03-16 6 views
4

多くの場合、nullを返す外部API呼び出しをラップするメソッドがあります。そうなったら、defaultの値を返したいと思います。この方法は、この値をジェネリック型にキャストできるかどうかを確認するにはどうすればよいですか?

public static T GetValue<T>(int input) 
{ 
    object value = ExternalGetValue(input); 
    return value != null ? (T)value : default(T) 
} 

のように見える問題が(T)valueが無効なキャスト例外を投げるかもしれないということです。だから、私は

var value = ExternalGetValue(input) as Nullable<T>; 

に変更するだろうと思ったが、これはwhere T : struct必要であり、私は同様の参照型を許可します。

次に、両方を処理するオーバーロードを追加しようとしました。

public static T GetValue<T>(int input) where T : struct { ... } 
public static T GetValue<T>(int input) where T : class { ... } 

しかし、制約に基づいてオーバーロードできないことがわかりました。

異なる名前の2つのメソッドを持つことができます。nullable型とnonnullable型の2つのメソッドがあることがわかりましたが、私はむしろそうしません。

asを使用せずにTにキャストできるかどうかを確認する良い方法はありますか?または、asを使用して、すべてのタイプに対応する単一の方法を使用できますか?

+0

方法は、あなたが予想よりも異なるタイプを返す場合、それはおそらく良いことです例外がスローされます。エラーを解決する代わりに、エラーを隠そうとしていないと確信していますか? – svick

+0

@svickこれは良い点です。具体的には、これはユーザーが入力したデータを特定の型にするべきですが、そうでないかもしれません。私は、デフォルト値を与えるのではなく、エラーがあったことをユーザーに知らせるほうがよいでしょう。 –

答えて

7

あなたはisを使用することができます。

return value is T ? (T)value : default(T); 

valueがnullの場合value is Tfalseを返すことに注意してください。)

+0

これは私が必要としていたものです。ありがとうございました。 –

関連する問題