投稿者 YuO  (社会人) 投稿日時 2010/8/18 13:23:06
ひゃあ,ごめんなさい。初期化順序が間違っていました。
まさかC#とVBで初期化順序が違うとは思わなかった……。
# すいません,基本C#屋なんです,と言い訳しておきます。

Imports System

Namespace VbLibrary
    Public Class Class1
        Public F1 As New Class3(GetType(Class1).FullName)

        Public Sub New()
            Console.WriteLine("{0}.ctor()"GetType(Class1).FullName)
        End Sub
    End Class

    Public Class Class2
        Inherits Class1

        Public F2 As New Class3(GetType(Class2).FullName)

        Public Sub New()
            MyBase.New()
            Console.WriteLine("{0}.ctor()"GetType(Class2).FullName)
        End Sub
    End Class

    Public Class Class3
        Public Sub New(ByVal s As String)
            Console.WriteLine("{0}.ctor({1})"Me.GetType().FullName, s)
        End Sub
    End Class
End Namespace

using System;

namespace CsLibrary
{
    public class Class1
    {
        public Class3 F1 = new Class3(typeof(Class1).FullName);

        public Class1 ()
        {
            Console.WriteLine("{0}.ctor()", typeof(Class1).FullName);
        }
    }

    public class Class2 : Class1
    {
        public Class3 F2 = new Class3(typeof(Class2).FullName);

        public Class2 ()
            : base()
        {
            Console.WriteLine("{0}.ctor()", typeof(Class2).FullName);
        }
    }

    public class Class3
    {
        public Class3 (string s)
        {
            Console.WriteLine("{0}.ctor({1})", this.GetType().FullName, s);
        }
    }
}

という,同じ動作をするはずのコードに対して,Class2を作成してみたところ,VBでは
VbLibrary.Class3.ctor(VbLibrary.Class1)
VbLibrary.Class1.ctor()
VbLibrary.Class3.ctor(VbLibrary.Class2)
VbLibrary.Class2.ctor()

と,基本クラスのフィールド→基本クラスのコンストラクタ→派生クラスのフィールド→派生クラスのコンストラクタの順序で実行しました。
それに対して,C#では,
CsLibrary.Class3.ctor(CsLibrary.Class2)
CsLibrary.Class3.ctor(CsLibrary.Class1)
CsLibrary.Class1.ctor()
CsLibrary.Class2.ctor()

と,派生クラスのフィールド→基本クラスのフィールド→基本クラスのコンストラクタ→派生クラスのコンストラクタの順序で実行しました。

根本的にこんなのCLIで決まっているだろうと思っていたのですが,甘かったです。