Рассмотрим этот 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
}
}
Почему отражение типа возврата для статического метода factory дает конкретный тип, а вызов конструктора inline дает интерфейс? Я бы ожидал, что оба они будут одинаковыми.
Кроме того, есть ли способ указать в лямбда-версии, что я хочу, чтобы возвращаемое значение было конкретным типом? Или вызывает статический метод единственный способ сделать это?