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

hco*_*bda 23 c# lambda c#-3.0

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

public void DoSomething()
{
    // ...

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 16

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


Zal*_*nGG 8

尽管贾里德·帕森(Jared Parson)的答案在历史上是正确的(2010!),但如果您搜索“通用Lambda C#”,则此问题将是Google的第一个热门问题。尽管没有语法允许lambda接受其他泛型参数,但是您现在可以使用局部(泛型)函数来获得相同的结果。当他们捕获上下文时,它们几乎就是您要寻找的。

public void DoSomething()
{
    // ...

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我修复了您的示例,以便它可以编译并明确定义的本地泛型函数返回一个字符串。希望你能接受我的改变。我从你的例子中学到了一些新东西!不幸的是,在 C# 编程指南中,主题 [本地函数](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/local-functions)(添加在C# 7.0) 没有说明对泛型参数的支持。 (2认同)