* whereを使って、条件を付け加えることが可能
* 「,」で、複数指定も可能
http://ufcpp.net/study/csharp/sp2_generics.html#where
構文
クラス定義
【アクセスレベル】class 【クラス名】<型引数>
where 【型引数中の型が満たすべき条件】(, 【型引数中の型が満たすべき条件】)// <= オプション
{
// クラス定義
}
メソッド定義
【アクセスレベル】 戻り値の型 メソッド名<型引数>(引数リスト)
where 【型引数中の型が満たすべき条件】(, 【型引数中の型が満たすべき条件】)// <= オプション
{
// メソッド定義
}
http://ufcpp.net/study/csharp/sp2_generics.html#merit
制約条件
制約 | 説明
-----------------------+---------------------------------------------
where T : struct | 型 T は値型である
where T : class | 型 T は参照型である
where T : new() | 引数なしのコンストラクタを持つ。
where T : 【class】 | 型 T は 【class】 で指定された型を継承する。
where T : 【interface】| 型 T は 【interface】 で指定されたインターフェースを実装する。
サンプル
* 詳細は以下の関連記事「ContextMenuStrip ~右クリックを使うには~」を参照のこと
private T GetSelectedControl<T>(object selectedControl)
where T : class
{
T returnValue = null;
if (selectedControl != null && selectedControl is T)
{
returnValue = (T)selectedControl;
}
return returnValue;
}
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
var selectedTextBox =
this.GetSelectedControl<TextBox>(this.selectedControl);
if (selectedTextBox != null && selectedTextBox.SelectionLength > 0)
{
selectedTextBox.Copy();
}
}
■ 使用上の注意
* Nullableには明示的にできない模様(少なくとも.NET3.5ではコンパイルエラー)
=> X : <Nullable<T>>