什么是C#中的方法组?
什么是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()); // <- 注意括号
在C#中,方法组是一组具有相同名称但具有不同参数的方法。当我们将方法组转换为委托时,可以根据委托的签名选择其中一个方法。
在上面的示例中,我们可以看到两个不同的方法组转换为了不同的委托。
在第一个示例中,方法组123.ToString
转换为了Func<string,string>
类型的委托fn
。这里我们选择了ToString()
方法的一个重载,该重载接受一个字符串参数。然后我们调用了委托并传入了一个参数"00000000"
,并打印了输出结果。
在第二个示例中,方法组123.ToString
转换为了Func<string>
类型的委托fn
。这里我们选择了ToString()
方法的一个重载,该重载没有参数。然后我们直接调用了委托,并打印了输出结果。
通过将方法组转换为委托,我们可以根据需要选择不同的方法进行调用,从而提高了代码的灵活性和可重用性。
C#中的方法组是什么?
在C#中,方法组是一个由相同名称的一组方法组成的实体。当我们需要将一个方法作为参数传递给另一个方法时,可以使用方法组。
一个方法组可以被视为一个委托类型的实例。委托是一个包含对特定方法的引用的类型,可以将其视为函数指针。
在使用LINQ时,可以使用方法组作为参数传递给LINQ操作。例如,可以通过方法组来选择一个列表中的元素。
下面是一个使用方法组的示例代码:
private string DoSomethingToMyString(string input) { // 这里是方法体 } public ListGetStringStuff() { 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__)
在C#中,方法组是指一组方法(可能只有一个方法)。理论上,ToString方法可以有多个重载(还有任何扩展方法):ToString(),ToString(string format)等,因此ToString本身就是一个“方法组”。
通常可以通过使用重载解析将方法组转换为(类型化的)委托,但不能转换为字符串等;这是没有意义的。一旦添加括号,重载解析再次启动,您就可以明确地标识出一个方法调用。
方法组的典型用途是什么?因为(我了解)它具有相同的名称,参数计数和/或类型将不同。因此,您无法使用该组调用多个方法。
它纯粹是一个编译器术语,用于“我知道方法名称,但不知道签名”;它在运行时没有存在。据我所知,方法组本身(没有括号等)的唯一用途是在委托构造期间。
ECMA 334v4 §14.1:方法组可以在调用表达式(§14.5.5)中使用,在委托创建表达式(§14.5.10.3)中使用,或者隐式转换为兼容的委托类型。在任何其他上下文中,将表达式分类为方法组会导致编译时错误。
方法组的协变和逆变支持允许将方法签名与委托类型匹配。这使您不仅可以分配具有匹配签名的方法,还可以分配返回更具体类型(协变)或接受具有更具体类型参数(逆变)的方法。
在我遇到此错误的100%的情况下,我忘记了方法调用中的括号,因为我以为它是一个属性。类似“您是否忘记了()”的错误实际上在99%的情况下是有用的,哈哈。