我无法让 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.");
}
}
在我的示例程序中:
public 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
.
关于此行为原因或解决方法的任何解释(即not“只需调用CExtensions.Trace(c, "Category", ...
”)将不胜感激。