C#.NET:generic

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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。