如何强制使用扩展方法而不是带参数的实例方法?

2023-11-23

我无法让 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", ...”)将不胜感激。


您不能使用扩展来“接管”现有的类方法。

如果呼叫无需分机即可正常工作,则添加分机时行为不应发生变化。这样做的原因是现有代码不应该因为稍后引入扩展而被破坏。

您必须为其使用不同的名称,或者使用与类方法不同的参数类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何强制使用扩展方法而不是带参数的实例方法? 的相关文章

随机推荐