【问题标题】:In C# how do I create an extension method that takes a lambda with generic parameters, Func<T, TResult> as a parameter.在 C# 中,如何创建一个扩展方法,该方法将带有泛型参数的 lambda Func<T, TResult> 作为参数。
【发布时间】:2018-05-18 20:27:46
【问题描述】:

我正在尝试创建一个将 Func 作为参数的扩展方法,但出现错误。这是我得到的:

public static class MyExtensions
{
    public static TResult ModifyString<T, TResult>(this string s, Func<T, TResult> f)
    {
        return f(s);
    }
}

return f(s); 行我收到一个错误:Error CS1503 Argument 1: cannot convert from 'string' to 'T'

如何使用泛型参数 T 和泛型返回类型 TResult 指定泛型 lambda Func?

【问题讨论】:

  • 您正确指定了 lambda。问题是它的参数是T 类型,并且您正在向它传递一个字符串,但是编译器没有任何通用方法可以将字符串转换为“绝对任何类型”,这就是T 可以做到的。
  • 用字符串类替换 T 或提供类似“where T: string”的概念
  • 显然,您希望f 成为作用于字符串的函数。你想要的似乎是TResult ModifyString&lt;TResult&gt;(this string s, Func&lt;string, TResult&gt; f) =&gt; f(s);。要么,要么TResult ModifyString&lt;T, TResult&gt;(this T t, Func&lt;T, TResult&gt; f) =&gt; f(t);
  • @KirillKorolev:你不能这样做where T : sealedtypewhere T : string 与“T 必须始终是字符串”相同,那么为什么要使用 T 呢?
  • @EricLippert 是的,这就是我好奇的原因,他为什么需要模板参数。

标签: c# .net lambda generic-type-argument extension-function


【解决方案1】:

作为the other answer andcomments suggest,你已经知道参数类型T,所以你只需要指定TResult

public static TResult ModifyString<TResult>(this string s, Func<string, TResult> f)
{
    return f(s);
}

或持续通过T:

public static TResult Modify<T, TResult>(this T s, Func<T, TResult> f)
{
    return f(s);
}

【讨论】:

  • 出于某种原因,我认为我的面试官有专门针对字符串(或其他具体类型)的扩展方法,而 lambda 必须采用通用参数,但现在我想我记错了, lambda 必须专门采用一个字符串。无论如何,谢谢!
【解决方案2】:

问题是您将“s” - 一个字符串传递给声明为采用“T”类型的函数。

更改 func 以接受字符串而不是 T,并返回一个字符串以使此代码与字符串一起使用。

public static class MyExtensions
{
    public static string ModifyString(this string s, Func<string, string> f)
    {
        return f(s);
    }
}

假设你只想要一个字符串结果。

【讨论】:

  • 我无法想象除此之外“修改字符串”还有什么含义 (for whatever my imagination is worth)。
  • @EdPlunkett 我也没有,但这仍然是一个假设
  • @EdPlunkett 这只是一个毫无意义的例子。有人问我是否可以创建一个扩展方法(不),它接受一个字符串(我认为)和一个对字符串进行操作并返回一些东西的通用 lambda。
  • @JoelsElf 好的。 Func 是通用的,这个答案使用它。如果您要传递一个字符串,您必须为该类型参数提供字符串(或将其限制为字符串或字符串的子类 - 但字符串是密封类,因此不能一个子类)。不过我不会说它毫无意义——你学到了一些东西。
  • @Joelself 实际上我几乎创建了这个答案的一个版本,正如我现在知道你想要的那样,但是我认为它更有可能来自问题。嗯,尽管如此,这仍然不是毫无意义的,对于这类东西,它始终如一地使用定义的类型很重要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2013-11-15
相关资源
最近更新 更多