我無法讓C#編譯器調用我創建的擴展方法,因爲它傾向於帶有params
參數的實例方法。如何用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