ECMA 335から、パーティション1のセクション8.10.4:
CTSは、基本タイプから見える名前(非表示)と派生クラスのレイアウトスロットの共有(上書き)の両方を独立して制御します。非表示は、派生クラスのメンバーを名前で非表示にするか、名前と署名で非表示にするかのいずれかとしてマークすることによって制御されます。非表示は常にメンバーの種類に基づいて実行されます。つまり、派生フィールド名はベースフィールド名を非表示にできますが、メソッド名、プロパティ名、イベント名は非表示にできません。派生メンバーが名前で非表示としてマークされている場合、同じ名前の基本クラスの同じ種類のメンバーは、派生クラスでは表示されません。メンバーが名前と署名によって非表示とマークされている場合、完全に同じ名前とタイプ(フィールドの場合)またはメソッドシグネチャ(メソッドの場合)を持つ同じ種類のメンバーのみが派生クラスから非表示になります。これら2つの形式の非表示の区別の実装は、完全にソース言語コンパイラとリフレクションライブラリによって提供されます。VES自体に直接的な影響はありません。
(それはすぐにはわかりませんが、hidebysig
「名前と署名で非表示にする」という意味です。)
また、パーティション2のセクション15.4.2.2にも:
hidebysigはツールの使用のために提供されており、VESによって無視されます。宣言されたメソッドが、一致するメソッドシグネチャを持つ基本クラス型のすべてのメソッドを隠すことを指定します。省略した場合、シグネチャに関係なく、メソッドは同じ名前のすべてのメソッドを非表示にする必要があります。
例として、次のように仮定します。
public class Base
{
public void Bar()
{
}
}
public class Derived : Base
{
public void Bar(string x)
{
}
}
...
Derived d = new Derived();
d.Bar();
C#コンパイラはを使用するため、Bar(string)
は非表示Bar()
にしないため、これは有効ですhidebysig
。「名前による非表示」セマンティクスを使用する場合Bar()
は、typeの参照を呼び出すことはできませんがDerived
、Baseにキャストしてそのように呼び出すことはできます。
編集:上記のコードをDLLにコンパイルし、それをildasmingし、を削除hidebysig
しBar()
、Bar(string)
再度ilasmingしてBar()
から、他のコードから呼び出してみました:
Derived d = new Derived();
d.Bar();
Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments
しかしながら:
Base d = new Derived();
d.Bar();
(コンパイルの問題はありません。)
Shadows
とOverloads
VB.NETインチ