次のような場合、「「メソッドグループ」から「文字列」に変換できません」などのエラーが頻繁に発生します。
var list = new List<string>();
// ... snip
list.Add(someObject.ToString);
もちろん、ToString
の後に呼び出しかっこを忘れたため、最後の行にタイプミスがありました。正しい形式は次のとおりです。
var list = new List<string>();
// ... snip
list.Add(someObject.ToString()); // <- notice the parentheses
メソッドグループは、メソッドのセット(1つだけの場合もあります)の名前です。つまり、理論上、ToString
メソッドには複数のオーバーロード(および拡張メソッド)が含まれる場合があります:ToString()
、ToString(string format)
など- ToString
自体は「メソッドグループ」です。
通常、オーバーロード解決を使用してメソッドグループを(型指定された)デリゲートに変換できますが、文字列などには変換できません。意味がありません。
括弧を追加したら、再び;オーバーロード解決が開始され、メソッド呼び出しが明確に識別されました。
また、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);
}
メソッドグループをデリゲートにキャストできます。
デリゲートシグネチャは、グループから1つのメソッドを選択します。
この例では、文字列パラメーターを受け取るToString()
オーバーロードを選択します。
Func<string,string> fn = 123.ToString;
Console.WriteLine(fn("00000000"));
この例では、パラメーターを使用しないToString()
オーバーロードを選択します。
Func<string> fn = 123.ToString;
Console.WriteLine(fn());
MSDN検索の最初の結果は次のとおりです。
メソッドグループは、呼び出す1つのメソッド、または呼び出す特定のメソッドを選択するオーバーロードされたメソッドのセットを識別します。
私の理解は、基本的にあなたがsomeInteger.ToString
を書くとき、それが参照するかもしれないからです:
Int32.ToString(IFormatProvider)
または以下を参照できます:
Int32.ToString()
そのため、メソッドグループと呼ばれます。
ToString
関数には多くのオーバーロードがあります-メソッドグループは、その関数のすべての異なるオーバーロードで構成されるグループになります。