char引数を得るためにStringの拡張メソッドを書いた、string.Remove(char)
。しかし、私がこれを使用したときに、代わりにデフォルトのstring.Remove(int)
メソッドを呼び出しました。拡張メソッドの解決
実際のメソッドの存在が暗黙の変換よりも高い優先順位を持っていてはなりませんか?
char引数を得るためにStringの拡張メソッドを書いた、string.Remove(char)
。しかし、私がこれを使用したときに、代わりにデフォルトのstring.Remove(int)
メソッドを呼び出しました。拡張メソッドの解決
実際のメソッドの存在が暗黙の変換よりも高い優先順位を持っていてはなりませんか?
インスタンスメソッドは拡張メソッドよりも優先されます。あなたの観察は同じことの証明です。
どのメソッドを呼び出すかを決めるときには、常に拡張メソッドよりも一致するインスタンスメソッドが選択されます。これは途中で直感的です。
深さのC#から言い換え、
コンパイラはあなたが は、インスタンスメソッドのように に見えるが、1つを見つけることが できないメソッドを呼び出ししようとしていることを確認すると、それは、その後探し 拡張メソッド(
(IChildとIBASE 両方が同様の拡張メソッド が定義されている場合、例えば.. IChild.ExtensionMethodは、選択された あります)using
ディレクティブに基づいて に表示されます) ターゲット拡張方法、 過負荷と同様 「より良い変換」の一つとして、複数の候補の 場合
また、TypeAにLibv1.0のインスタンスメソッドとしてSecretMethodがないと言うことができます。したがって、拡張メソッドSecretMethodを記述します。作者がv2.0で同じ名前とシグネチャのインスタンスメソッドを導入した場合(this
paramを使用)、最新のLibv2.0を使用してソースを再コンパイルする場合は、拡張メソッドへの既存の呼び出し新しいインスタンスメソッドに自動的にルーティングされます。
この動作は正しいです。その理由は、拡張メソッドを導入しても、既存のコードの実行方法を変えてはならないからです。コードは、この "余分な"拡張メソッドの有無にかかわらず、まったく同じように動作する必要があります。特定のケースでは(あなたのような)直観に反するように見えるかもしれませんが、理由があります。
少なくとも、直接的な方法はありませんが、暗黙的なキャストが必要なものは1つのみです。だから、私はそれが直接的な方法を探すだろうと思った。 –
"拡張メソッドへの既存の呼び出しはすべて、現在、新しいインスタンスメソッドに自動的にルーティングされます。 - これは、再コンパイル時にのみカウントされることに注意してください。拡張呼び出しは、単純に静的メソッド呼び出しに変換されます。 – Dykam
コンパイラは、必要に応じて暗黙の変換を使用して、インスタンスメソッドを使用してメソッド解決要求を満たすために最善を尽くします。拡張メソッドは、それができない場合にのみ見えます。また、インスタンスメソッドを見つけるための暗黙のキャストを試みることはstdです。動作。 MyFunc( 'A')はa = 65の静的void MyFunc(int a)に解決されます。これはすべて、あなたの拡張メソッドを取らない名前に定義することで回避できますが、パラ。 – Gishu