9

我怎样才能同时编译这两种方法?

public static IEnumerable<string> DoSomething(params string[] args)
{ // do something }
public static IEnumerable<string> DoSomething(this string[] args)
{ // do something }

我得到这个编译错误:

Type 'Extensions' already defines a member called 'DoSomething' with the same parameter types Extensions.cs

这样我就可以做到这一点:

new string[] { "", "" }.DoSomething();
Extensions.DoSomething("", ""); 

如果没有 params 方法,我必须这样做:

Extensions.DoSomething(new string[] { "", "" });

更新:基于OR Mapper的回答

public static IEnumerable<string> DoSomething(string arg, params string[] args)
{
    // args null check is not required
    string[] argscopy = new string[args.Length + 1];
    argscopy[0] = arg;
    Array.Copy(args, 0, argscopy, 1, args.Length);
    return argscopy.DoSomething();
}

更新:我现在喜欢HugoRune的回答。

4

3 回答 3

12

您可以向版本添加附加参数params

public static IEnumerable<string> DoSomething(string firstArg, params string[] moreArgs)

这应该足以让编译器将其与string[]扩展方法区分开来。

正如用户SLaksparams所建议的,如果需要支持空数组的情况,则应在这种情况下提供不带任何参数的额外重载:

public static IEnumerable<string> DoSomething()
于 2012-11-27T22:15:07.620 回答
3

迟到的答案:

另一种选择是将两种方法放在不同的类中。由于您在调用扩展方法(带this参数的方法)时从不使用类名,因此扩展方法可以在同一命名空间中的任何公共静态类中,没有任何明显的区别。

// contains static methods to help with strings
public static class StringTools
{
    public static IEnumerable<string> DoSomething(params string[] args)
    {
        // do something
    }
}

// contains only extension methods
public static class StringToolsExtensions
{
    public static IEnumerable<string> DoSomething(this string[] args)
    {
        return StringTools.DoSomething(args);
    }
}

这样可以避免复制字符串数组,不需要不带参数的额外重载,我会说它看起来更干净。我总是将扩展方法和其他静态方法分开以避免混淆。

于 2013-07-02T09:40:35.850 回答
1
  1. 您可以为这两种方法之一指定不同的名称。IEDoSomething2
  2. 您可以只使用一种方法。相同的方法,相同的参数列表;显然他们在做同样的事情(因为你没有按照#1给他们不同的名字)。把它们结合起来。
  3. 您可以更改其中一种方法的参数列表。即(此字符串[] args,对象未使用参数)
于 2012-11-27T22:16:34.673 回答