代わりにparams
引数を持つインスタンスメソッドを使用しているので、作成した拡張メソッドを呼び出すためにC#コンパイラを取得できません。paramsでインスタンスメソッドの代わりに拡張メソッドを強制的に使用する方法はありますか?
public class C
{
public void Trace(string format, params object[] args)
{
Console.WriteLine("Called instance method.");
}
}
と、拡張子::私のサンプルプログラムで
public static class CExtensions
{
public void Trace(this C @this, string category, string message, params Tuple<string, decimal>[] indicators)
{
Console.WriteLine("Called extension method.");
}
}
:
pubic void Main()
{
var c = new C();
c.Trace("Message");
c.Trace("Message: {0}", "foo");
c.Trace("Category", "Message", new KeyValuePair<string, decimal>("key", 123));
}
すべてのコールの印刷を例えば、私は次のクラスとそのメソッドを持って
を言いますCalled instance method.
。
明らかに、私はクラスC
にアクセスできないのですが、私は拡張メソッドの作成に気を配りませんし、拡張機能も重要です。
コンパイラは、拡張メソッドよりもインスタンスメソッドを優先しますが、これが唯一のルールですか?つまり、Method(string format, params object[] args)
のようなメソッドを持つクラスは、string
の最初のパラメータを持つ拡張メソッドを持つことはできません。
この動作の理由またはその回避方法(ではなく、 "単にCExtensions.Trace(c, "Category", ...
と呼んでください)についての説明は、非常に高く評価されます。
これまでに私はこれを見てきました。唯一の解決策は、メソッドの名前を変更することだと思われます。私は修正があるかどうかを知ることに興味があります。 – Polynomial