たとえば、ソース コードに静的クラスを導入すると、csc コンパイラはそれを封印された抽象クラスに変換します (間違っていたら訂正してください)。
しかし、インターフェイスはどうですか。CLR はインターフェイスとは何かを認識していますか? または、コンパイラはそれをある種の型宣言に変換しますか?
たとえば、ソース コードに静的クラスを導入すると、csc コンパイラはそれを封印された抽象クラスに変換します (間違っていたら訂正してください)。
しかし、インターフェイスはどうですか。CLR はインターフェイスとは何かを認識していますか? または、コンパイラはそれをある種の型宣言に変換しますか?
たとえば、ソース コードに抽象クラスを導入すると、csc コンパイラはそれをシールされた静的クラスに変換します (間違っていたら訂正してください)。
私はあなたを訂正しています。
次のような抽象クラス:
public abstract class Foo
{
}
ILでは次のようになります。
.class public abstract auto ansi beforefieldinit Foo
extends [mscorlib]System.Object
{
.method family hidebysig specialname rtspecialname instance void .ctor() cil managed
{
}
}
しかし、インターフェイスはどうですか。CLR はインターフェイスとは何かを認識していますか?
はい、それは知っています。例えば:
public interface IFoo
{
}
に変換します。
.class public interface abstract auto ansi IFoo
{
}
あなたは間違っています。static class
同等の に変換されるのは ですsealed abstract class
。
また、インターフェイスは .NET の完全なメンバーであり、他の種類の型とは異なる独自のメタデータと動作 (多重継承など) を備えています。
次のコードに対して ILSpy が表示する内容を次に示します。
C#:
interface A
{
void M();
}
イル:
.class interface nested private auto ansi abstract A
{
// Methods
.method public hidebysig newslot abstract virtual
instance void M () cil managed
{
} // end of method A::M
} // end of class A
だから、はい、それは知っています。
これは、インターフェイスが CLR にどのように見えるかです。
.class public interface abstract auto ansi IDisposable
{
.custom instance void System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = { bool(true) }
.method public hidebysig newslot abstract virtual instance void Dispose() cil managed
{
}
}
例として取り上げた IDisposable 。