在C#中,不允許我們 從像System.Array這樣的類中派生一個類,在IL中沒有這樣的約束。因此,上面的代碼不會生成任何錯誤 。
我們確實能夠推斷出C#編譯器具有上面的約束而IL的約束則比較少。一門語言的規則是由編譯 器在編譯期間決定的。
需要說明的是,在C#中,有一些類,是我們不能從中派生的 ——Delegate、Enum和ValueType。
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (class aa V_0)
newobj instance void aa::.ctor()
stloc.0
ret
}
}
.class public auto ansi aa extends bb
{
.method public hidebysig specialname rtspecialname instance void .ctor() il managed
{
ldarg.0
call instance void bb::.ctor()
ldstr "aa"
call void [mscorlib]System.Console::WriteLine (class System.String)
ret
}
}
.class public auto ansi bb extends cc
{
.method public hidebysig specialname rtspecialname instance void .ctor() il managed
{
ldarg.0
call instance void cc::.ctor()
ldstr "bb"
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
}
.class public auto ansi cc extends aa
{
.method public hidebysig specialname rtspecialname instance void .ctor() il managed
{
ldarg.0
call instance void aa::.ctor()
ldstr "cc"
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
}
Error
Exception occurred: System.TypeLoadException: Could not load class 'aa' because the format is bad (too long?)
at zzz.vijay()