where を使用して対象となる型に制限をかけることができます。
new()制約
引数なしのコンストラクタがあるもののみ指定可能
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public Form1()
{
InitializeComponent();
TestClass cls = new TestClass();
cls.Val1 = "あいう";
MessageBox.Show(cls.Val1 + "\n" + GetNewInstance(cls).Val1);
}
private T GetNewInstance<T>(T cls) where T :new()
{
return new T();
}
class TestClass
{
public string Val1 { get; set; }
public TestClass()
{
Val1 = "デフォルト値";
}
}
}
}
クラス・インタフェース制約
任意のクラスか、それを継承しているクラス・インタフェースのみ指定可能
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public Form1()
{
InitializeComponent();
TestClassSub cls = new TestClassSub();
MessageBox.Show(DoSomething(cls));
}
private string DoSomething<T>(T cls) where T : TestClass
{
return cls.GetValue();
}
class TestClassSub : TestClass
{
}
class TestClass
{
private string Val1 { get; set; }
public TestClass()
{
Val1 = "あいう";
}
public string GetValue()
{
return Val1;
}
}
}
}
生の型パラメータ制約
一方の引数の型で、もう一方の型を制約します。
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public Form1()
{
InitializeComponent();
MessageBox.Show(Equals(new TestClassSub("あ"), new TestClass("あ")).ToString());
}
private bool Equals<T1, T2>(T1 cls1, T2 cls2) where T1 : T2
{
return cls1.Equals(cls2);
}
class TestClassSub : TestClass
{
public TestClassSub(string val)
: base(val)
{
}
}
class TestClass
{
public string Val1 { get; set; }
public TestClass(string val)
{
Val1 = val;
}
public override bool Equals(object obj)
{
TestClass cls = obj as TestClass;
if (cls == null)
{
return false;
}
return this.Val1 == cls.Val1;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
}
}
参照型制約
参照型のみ指定可能
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public Form1()
{
InitializeComponent();
MessageBox.Show(GetValue(new TestClass("あ")));
}
private string GetValue<T>(T cls) where T : class
{
return cls.ToString();
}
class TestClass
{
public string Val1 { get; set; }
public TestClass(string val)
{
Val1 = val;
}
public override string ToString()
{
return Val1;
}
}
}
}
値型制約
intやstructなどの値型のみ指定可能
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public Form1()
{
InitializeComponent();
MessageBox.Show(GetValue(123));
}
private string GetValue<T>(T st) where T : struct
{
return st.ToString();
}
}
}
最終更新:2014年02月23日 01:26