gpt4 book ai didi

c# - 委托(delegate)返回类型与 lambda 函数不同

转载 作者:可可西里 更新时间:2023-11-01 03:07:58 24 4
gpt4 key购买 nike

考虑这个 MCVE:

using System;

public interface IThing { }

public class Foo : IThing
{
public static Foo Create() => new Foo();
}

public class Bar : IThing
{
public static Bar Create() => new Bar();
}

public delegate IThing ThingCreator();

class Program
{
static void Test(ThingCreator creator)
{
Console.WriteLine(creator.Method.ReturnType);
}

static void Main()
{
Test(Foo.Create); // Prints: Foo
Test(Bar.Create); // Prints: Bar

Test(() => new Foo()); // Prints: IThing
Test(() => new Bar()); // Prints: IThing
}
}

为什么反射(reflect)静态工厂方法的返回类型给出的是具体类型,而内联调用构造函数给出的是接口(interface)?我希望它们都是一样的。

此外,有没有办法在 lambda 版本中指定我希望返回值是具体类型?还是调用静态方法是唯一的方法?

最佳答案

lambda 表达式的返回类型不是从 lambda 实际返回的内容中推断出来的,而是从它被分配到的类型中推断出来的。即,您不能像这样分配 lambda(除非涉及泛型类型参数;请参阅 Eric Lippert 的评论):

// This generates the compiler error:
// "Cannot assign lambda expression to an implicitly-typed variable".
var lambda = () => new Foo();

你必须总是做这样的事情(lambda 总是分配给委托(delegate)类型):

Func<MyType> lambda = () => new Foo();

因此在 Test(() => new Foo()); 中,lambda 的返回类型由分配给它的参数类型决定(IThingThingCreator 的返回类型。

Test(Foo.Create); 中,您根本没有 lambda,而是声明为 public static Foo Create() ... 的方法。这里的类型是明确指定的,并且是 Foo(无论是静态方法还是实例方法都没有区别)。

关于c# - 委托(delegate)返回类型与 lambda 函数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42846004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com