9

これら 2 つのメソッドの両方をコンパイルするにはどうすればよいですか?

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[]これは、コンパイラが拡張メソッドと区別するのに十分なはずです。

ユーザーSLaksが提案しているように、この場合、空のparams配列の状況をサポートする必要がある場合は、引数なしの追加のオーバーロードを提供する必要があります。

public static IEnumerable<string> DoSomething()
于 2012-11-27T22:15:07.620 に答える
1
  1. 2つのメソッドのいずれかに異なる名前を付けることができます。すなわちDoSomething2
  2. 1つの方法を使用できます。これは、同じパラメータリストを使用した同じメソッドです。明らかに彼らは同じことをしている(あなたが#1のように彼らに異なる名前を付けなかったので)。それらを組み合わせるだけです。
  3. いずれかのメソッドのパラメータリストを変更できます。すなわち(このstring [] args、object usedParameter)
于 2012-11-27T22:16:34.673 に答える