1

次のコードがコンパイルされます。

class Testing<TKey, TValue>
{
    public bool Test(TKey key)
    {
        return key == null;
    }
}

ただし、TKeyは値型にすることができ、値「null」を許可しない可能性があります。

このプログラムの結果と、制約を追加する方法を知っています。私が疑問に思っているのは、TKeyが「クラス」に制約されていないのに、なぜコンパイラがこれを許可しないのかということです。

4

5 に答える 5

5

いろいろな場面でこれができると便利です。TKeyがnull許容値型でない場合、比較の結果は常にfalseになります。(JITterがそのブランチを完全に削除する可能性があります。JITtedコードの1つのバージョンはすべての参照型で共有されますが、値型ごとにreJITすることを忘れないでください。)

編集:これの興味深い使用法の1つはNullable<T>、nullとの比較を可能にすることです。またはの制約TFoo=Nullable<T>満たしていません。where TFoo : class where TFoo : struct

于 2009-02-10T17:56:16.057 に答える
1

「なぜ」についてはよくわかりません。default(T)ただし、これを修正するには、の代わりにを使用できますnull

于 2009-02-10T17:53:20.790 に答える
0

変数をオブジェクトにキャストし、object ==演算子を使用するため、値型の場合は常にfalseです。

于 2009-02-10T17:56:36.383 に答える
0

csharpのすべてがオブジェクトであるためです。
つまり、C#のすべての型は、直接または間接的にオブジェクトクラス型から派生します。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        struct SimpleStruct
        {
            int a;
            public SimpleStruct(int a)
            {
                this.a = a;
            }
        }
        enum SimpleEnum
        {
            a = 1,
            b = 2,
        }

        static void Main(string[] args)
        {
            SimpleStruct tp = new SimpleStruct(2);

            object ob = tp;
            if (ob != null)
            {
                Console.WriteLine("struct is an object : " + ob);
                tp = (SimpleStruct)ob;
            }

            SimpleEnum tp2 = SimpleEnum.a;
            ob = tp2;
            if (ob != null)
            {
                Console.WriteLine("enum is an object : " + ob);
                tp2 = (SimpleEnum)ob;
            }
            Console.ReadKey();
        }
    }
}
于 2009-02-10T17:56:47.223 に答える
0

TKey は null 許容型である可能性があるためです。

C# 2.0 の構造体は null と同等です。そのため、コンパイル エラーなしで 0 == null を記述できます。

于 2009-02-10T18:20:22.817 に答える