是否可以在C#中定义通用lambda?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在C#中定义通用lambda?相关的知识,希望对你有一定的参考价值。

我在一个操作指定类型的方法中有一些逻辑,我想创建一个封装逻辑的通用lambda。这就是我想要做的精神:

public void DoSomething()
{
    // ...

    Func<T> GetTypeName = () => T.GetType().Name;

    GetTypeName<string>();
    GetTypeName<DateTime>();
    GetTypeName<int>();

    // ...
}

我知道我可以将类型作为参数传递或创建泛型方法。但我很想知道lambda是否可以定义自己的泛型参数。 (所以我不是在寻找替代方案。)据我所知,C#3.0不支持这一点。

答案

无法创建具有新通用参数的lambda表达式。您可以在包含的方法或类型上重用通用参数,但不能创建新的参数。

另一答案

虽然你不能(但是?)有一个通用lambda(另见this answerthis question的一个注释),你可以得到相同的用法语法。如果你定义:

public static class TypeNameGetter
{
    public static string GetTypeName<T>()
    {
        return typeof( T ).Name;
    }
}

你可以使用它(虽然using static是C#6):

using static TypeNameGetter;
public class Test
{
    public void Test1()
    {
        var s1 = GetTypeName<int>();
        var s2 = GetTypeName<string>();
    }
}
另一答案

虽然Jared Parson的回答在历史上是正确的(2010年!),但如果您搜索“通用lambda C#”,这个问题将成为Google的第一个问题。虽然lambdas没有接受其他泛型参数的语法,但现在可以使用本地(通用)函数来实现相同的结果。当他们捕捉上下文时,他们几乎就是你正在寻找的东西。

public void DoSomething()
{
    // ...

    string GetTypeName<T>() => typeof(T).GetType().Name;

    string nameOfString = GetTypeName<string>();
    string nameOfDT = GetTypeName<DateTime>();
    string nameOfInt = GetTypeName<int>();

    // ...
}
另一答案

这只有在您的DoSomething方法是通用的或其类是通用的时才可能。

以上是关于是否可以在C#中定义通用lambda?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个可变的通用lambda?

C++ lambda 友谊

inline内联函数

何时使用函数模板而不是通用 lambda?

C ++ 11 lambda作为成员变量?

是否可以动态编译和执行 C# 代码片段?