4

C# 4.0 の新機能「オプション パラメーター」を試していたときに、これは興味深いことでした。

C# 4.0 で「オプションのパラメーター」を使用するには、次の 2 つの方法があることを知っています。

static void TestMethod(int parameter = 5) { }
static void TestMethod2([Optional, DefaultParameterValue(5)]int parameter) { }

このコードをコンパイルし、IL Dasm を使用してアセンブリを表示すると、IL Dasm の「MetaInfo」ウィンドウに、次のような OptionalAttribute への型参照があることがわかります。

Token:             0x01000002
ResolutionScope:   0x23000001
TypeRefName:       System.Runtime.InteropServices.OptionalAttribute
MemberRef #1 (0a000001)
-------------------------------------------------------
    Member: (0a000001) .ctor: 
    CallCnvntn: [DEFAULT]
    hasThis 
    ReturnType: Void
    No arguments.

しかし、DefaultParameterValueAttribute の兆候はありません。何故ですか?

実際には、2 つの属性は両方ともここにあるべきではないと思います。これらはコンパイラによって異なる方法で扱われ、独自のフラグ値を持っているためです。私の言いたいことを説明するために、これを見てください:

    Method #2 (06000002) 
-------------------------------------------------------
    MethodName: TestMethod (06000002)
    Flags     : [Private] [Static] [HideBySig] [ReuseSlot]  (00000091)
    RVA       : 0x00002053
    ImplFlags : [IL] [Managed]  (00000000)
    CallCnvntn: [DEFAULT]
    ReturnType: Void
    1 Arguments
        Argument #1:  I4
    1 Parameters
        (1) ParamToken : (08000002) Name : parameter flags: [Optional] [HasDefault]  (00001010) Default: (I4) 5

Method #3 (06000003) 
-------------------------------------------------------
    MethodName: TestMethod2 (06000003)
    Flags     : [Private] [Static] [HideBySig] [ReuseSlot]  (00000091)
    RVA       : 0x00002056
    ImplFlags : [IL] [Managed]  (00000000)
    CallCnvntn: [DEFAULT]
    ReturnType: Void
    1 Arguments
        Argument #1:  I4
    1 Parameters
        (1) ParamToken : (08000003) Name : parameter flags: [Optional] [HasDefault]  (00001010) Default: (I4) 5

これは、2 つのメソッドのメタデータです。各コード セクションの最後の行には、既定のパラメーター値が既に格納されていることがわかりますが、なぜ OptionalAttribute がまだ参照されているのでしょうか?

4

1 に答える 1