2011-09-04 3 views
6

次の拡張機能の設定方法は?私はEnumにComboBoxeをバインドしています。この場合、nullが返されるため、コンパイルされません。汎用メソッドを作成してnullを返し、enumを受け入れる方法は?

public static T GetSelectedValue<T>(this ComboBox control) 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 

注:デフォルト(T)ではなくnullを返すようにします。 質問は、私が使用しなければならないどこの表現ですか?

+0

次の投稿は、汎用メソッドからnullを返すことに関するご質問にお答えします:http://stackoverflow.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c – Waqas

答えて

5

戻る代わりに、プレーンTのNULL可能:

public static T? GetSelectedValue<T>(this ComboBox control) where T : struct 
{ 
    if (control.SelectedValue == null) 
     return null; 

    return (T)control.SelectedValue; 
} 
5

これは不可能です。値の型をnullにすることはできません。拡張メソッドはTのインスタンスを返し、このTが列挙型(値型)の場合、その値はnullにはなりません。戻り値の型を変更せずに、このようなメソッドのシグネチャは単に存在することはできません。限り、ジェネリックパラメータを列挙型に制限する限り、これはC#でも不可能ですが、MSILでも可能です。ジョンはblogged about itです。

+0

何を彼がヌルではなくデフォルトのを返した場合は? – Tim

+0

@Tim、もちろん、この拡張メソッドを書く正しい方法はありますが、彼は彼の質問でそれを言いましたので、OPはすでにこれを知っています。私は、彼が簡単に書くことを試みているジェネリックメソッドのシグネチャが存在できないことを彼に説明しようとしました。 –

+0

@ダーリン:答えに感謝します。私の場合は、Konradが役に立ちました。 –

1

この場合、最も一般的な方法は、あなたの列挙の他のすべてのメンバーの中では、あなたのロジックNone == nullで、その場合には、Noneを定義します。

+0

うーん、便利だと思うが、 'None'の値に' 0'を代入して拡張子に 'default(T)'を返すようにしてもいいと思う。 –

+0

@French Boy:これは簡単で読みやすいので、問題の種類。 – Tigran

関連する問題