什么是C#中的方法组?

11 浏览
0 Comments

什么是C#中的方法组?

在类似以下情况中,我经常遇到\"无法从\'method group\'转换为\'string\'\"这样的错误:\n

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

\n当然最后一行有一个错别字,因为我忘记了在ToString之后加上括号。正确的形式应该是:\n

var list = new List();
// ... snip
list.Add(someObject.ToString()); // <- 注意括号

\n然而,我开始纳闷什么是方法组。GoogleMSDN都没有提供太多帮助。

0
0 Comments

在C#中,方法组是一组具有相同名称但具有不同参数的方法。当我们将方法组转换为委托时,可以根据委托的签名选择其中一个方法。

在上面的示例中,我们可以看到两个不同的方法组转换为了不同的委托。

在第一个示例中,方法组123.ToString转换为了Func<string,string>类型的委托fn。这里我们选择了ToString()方法的一个重载,该重载接受一个字符串参数。然后我们调用了委托并传入了一个参数"00000000",并打印了输出结果。

在第二个示例中,方法组123.ToString转换为了Func<string>类型的委托fn。这里我们选择了ToString()方法的一个重载,该重载没有参数。然后我们直接调用了委托,并打印了输出结果。

通过将方法组转换为委托,我们可以根据需要选择不同的方法进行调用,从而提高了代码的灵活性和可重用性。

0
0 Comments

C#中的方法组是什么?

在C#中,方法组是一个由相同名称的一组方法组成的实体。当我们需要将一个方法作为参数传递给另一个方法时,可以使用方法组。

一个方法组可以被视为一个委托类型的实例。委托是一个包含对特定方法的引用的类型,可以将其视为函数指针。

在使用LINQ时,可以使用方法组作为参数传递给LINQ操作。例如,可以通过方法组来选择一个列表中的元素。

下面是一个使用方法组的示例代码:

private string DoSomethingToMyString(string input)
{
    // 这里是方法体
}
public List GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString);
}

在上面的代码中,我们可以看到`DoSomethingToMyString`方法被作为方法组传递给了LINQ的`Select`方法。这样做可以简化代码并提高可读性。

通过使用方法组,我们可以省略使用lambda表达式来创建一个匿名方法。这样做可以避免创建不必要的包装方法,提高代码的执行效率。

需要注意的是,使用方法组时,方法的签名必须与委托类型兼容。在上面的示例中,`DoSomethingToMyString`方法和`Select`方法需要接受一个字符串参数并返回一个字符串。

方法组是C#中一种方便的方式,可以将一个方法作为参数传递给另一个方法。它可以简化代码,并提高代码的可读性和执行效率。

参考链接:

- [vibrantcode.com/2013/02/19/lambdas-vs-method-groups](https://web.archive.org/web/20190301033146/http://vibrantcode.com/2013/02/19/lambdas-vs-method-groups)

- [System.Linq.Enumerable.Select Method](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.select#System_Linq_Enumerable_Select__2_System_Collections_Generic_IEnumerable___0__System_Func___0___1__)

0
0 Comments

在C#中,方法组是指一组方法(可能只有一个方法)。理论上,ToString方法可以有多个重载(还有任何扩展方法):ToString(),ToString(string format)等,因此ToString本身就是一个“方法组”。

通常可以通过使用重载解析将方法组转换为(类型化的)委托,但不能转换为字符串等;这是没有意义的。一旦添加括号,重载解析再次启动,您就可以明确地标识出一个方法调用。

方法组的典型用途是什么?因为(我了解)它具有相同的名称,参数计数和/或类型将不同。因此,您无法使用该组调用多个方法。

它纯粹是一个编译器术语,用于“我知道方法名称,但不知道签名”;它在运行时没有存在。据我所知,方法组本身(没有括号等)的唯一用途是在委托构造期间。

ECMA 334v4 §14.1:方法组可以在调用表达式(§14.5.5)中使用,在委托创建表达式(§14.5.10.3)中使用,或者隐式转换为兼容的委托类型。在任何其他上下文中,将表达式分类为方法组会导致编译时错误。

方法组的协变和逆变支持允许将方法签名与委托类型匹配。这使您不仅可以分配具有匹配签名的方法,还可以分配返回更具体类型(协变)或接受具有更具体类型参数(逆变)的方法。

在我遇到此错误的100%的情况下,我忘记了方法调用中的括号,因为我以为它是一个属性。类似“您是否忘记了()”的错误实际上在99%的情况下是有用的,哈哈。

0