超不定期雑記

~プログラムとかサイエンスとかいろいろと~

目次

Blog 利用状況

ニュース

書庫

2008年7月8日

ジェネリッククラス内では==に制限がある?

VisualStudio2005 の C# で "==" を定義したクラスを作ったんですが、それをジェネリッククラス内で使おうとしたら呼び出されませんでした。

裸で使えば問題なく動作するんですが、ジェネリック変数同士では Object.operator== が呼び出されているように思えます。

サンプルコード

class Program
{
    static void Main( string[] args )
    {
        SampleData data0 = new SampleData();
        SampleData data1 = new SampleData();
        bool ret_operator = ( data0 == data1 );

        GenericData<SampleData> gen_data = new GenericData<SampleData>();
        gen_data.data1 = new SampleData();
        gen_data.data2 = new SampleData();
        gen_data.OperatorEq();
    }
}

class GenericData<TYPE> where TYPE : class
{
    public TYPE data1 = null;
    public TYPE data2 = null;

    public void OperatorEq()
    {
        Console.WriteLine( "GenericData.OperatorEq Start" );

        bool ret_operator = ( data1 == data2 );

        Console.WriteLine( "GenericData.OperatorEq End" );
    }
}

class SampleData
{
    public static bool operator ==( SampleData lhs, SampleData rhs )
    {
        Console.WriteLine( "SampleData.operator==" );

        return true;
    }

    public static bool operator !=( SampleData lhs, SampleData rhs )
    {
        Console.WriteLine( "SampleData.operator!=" );

        return !( lhs == rhs );
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public override bool Equals( object obj )
    {
        return base.Equals( obj );
    }
}

結果

SampleData.operator==
GenericData.OperatorEq Start
GenericData.OperatorEq End

posted @ 17:28 | Feedback (11)