web-dev-qa-db-ja.com

C#のメソッドグループとは何ですか?

次のような場合、「「メソッドグループ」から「文字列」に変換できません」などのエラーが頻繁に発生します。

var list = new List<string>();
// ... snip
list.Add(someObject.ToString);

もちろん、ToStringの後に呼び出しかっこを忘れたため、最後の行にタイプミスがありました。正しい形式は次のとおりです。

var list = new List<string>();
// ... snip
list.Add(someObject.ToString()); // <- notice the parentheses

しかし、メソッドグループとは何だろうと思いました。 Google はあまり役に立ちません MSDN

327
Andrei Rînea

メソッドグループは、メソッドのセット(1つだけの場合もあります)の名前です。つまり、理論上、ToStringメソッドには複数のオーバーロード(および拡張メソッド)が含まれる場合があります:ToString()ToString(string format)など- ToString自体は「メソッドグループ」です。

通常、オーバーロード解決を使用してメソッドグループを(型指定された)デリゲートに変換できますが、文字列などには変換できません。意味がありません。

括弧を追加したら、再び;オーバーロード解決が開始され、メソッド呼び出しが明確に識別されました。

303
Marc Gravell

また、LINQを使用している場合は、明らかにmyList.Select(methodGroup)のようなことができます。

だから、たとえば、私は持っています:

private string DoSomethingToMyString(string input)
{
    // blah
}

次のように使用する変数を明示的に指定する代わりに:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(str => DoSomethingToMyString(str));
}

変数の名前を省略できます:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString);
}
151
Kaeles

メソッドグループをデリゲートにキャストできます。

デリゲートシグネチャは、グループから1つのメソッドを選択します。

この例では、文字列パラメーターを受け取るToString()オーバーロードを選択します。

Func<string,string> fn = 123.ToString;
Console.WriteLine(fn("00000000"));

この例では、パラメーターを使用しないToString()オーバーロードを選択します。

Func<string> fn = 123.ToString;
Console.WriteLine(fn());
20
Jack

MSDN検索の最初の結果は次のとおりです。

メソッドグループは、呼び出す1つのメソッド、または呼び出す特定のメソッドを選択するオーバーロードされたメソッドのセットを識別します。

私の理解は、基本的にあなたがsomeInteger.ToStringを書くとき、それが参照するかもしれないからです:

Int32.ToString(IFormatProvider) 

または以下を参照できます:

Int32.ToString()

そのため、メソッドグループと呼ばれます。

18
oscarkuo

ToString関数には多くのオーバーロードがあります-メソッドグループは、その関数のすべての異なるオーバーロードで構成されるグループになります。

17