我知道这是一个愚蠢的错误,但我无法弄清楚发生了什么。我已经创建了一些扩展方法,并尝试访问它们,但默认方法不断被调用:
namespace MyProject
{
public static class Cleanup
{
public static string cleanAbbreviations(this String str) {
if (str.Contains("JR"))
str = str.Replace("JR", "Junior");
return str;
}
public static bool Contains(this String str, string toCheck)
{//Ignore the case of our comparison
return str.IndexOf(toCheck, StringComparison.OrdinalIgnoreCase) >= 0;
}
public static string Replace(this String str, string oldStr, string newStr)
{//Ignore the case of what we are replacing
return Regex.Replace(str, oldStr, newStr, RegexOptions.IgnoreCase);
}
}
}
答案 0 :(得分:5)
只有在找不到合适的实例方法时,编译器才会查找扩展方法。您不能以这种方式隐藏现有的实例方法。
e.g。已在Contains
上声明string
方法,其中一个string
作为参数。这就是为什么你的扩展方法没有被调用的原因。
来自C#规范:
7.6.5.2扩展方法调用
前面的规则意味着实例方法优先于 扩展方法,即内部可用的扩展方法 名称空间声明优先于扩展方法 外部名称空间声明和扩展方法中可用 直接在命名空间中声明的优先级超过扩展名 使用using命名空间导入到同一命名空间的方法 指令。
答案 1 :(得分:1)
编译器总是更喜欢类型的实际实例方法而不是扩展方法中匹配的重载。如果你想解决这个问题,你需要在没有扩展糖的情况下调用它们(或者给扩展方法指定不同的名称):
if(Cleanup.Contains(str, "JR"))
str = Cleanup.Replace(str, "JR", "Junior");
请注意,您可以在Cleanup.
的其他方法中省略Cleanup
- 为了清楚起见,我将其包含在此处。