C# 无法将匿名类型传递给泛型构造函数

C# 无法将匿名类型传递给泛型构造函数,c#,generics,anonymous-types,C#,Generics,Anonymous Types,假设我有以下泛型类: public class Control<TItem> { public Control(TItem item) { } } 但是,如果我不是通过构造函数,而是通过类外的泛型方法来实现这一点,它似乎可以工作: // can compile: var control2 = CreateControl(objectOfAnonymousType); 使用的工厂方法: static Control<TItem> CreateCo

假设我有以下泛型类:

public class Control<TItem>
{
    public Control(TItem item)
    {
    }
}
但是,如果我不是通过构造函数,而是通过类外的泛型方法来实现这一点,它似乎可以工作:

// can compile:
var control2 = CreateControl(objectOfAnonymousType);
使用的工厂方法:

static Control<TItem> CreateControl<TItem>(TItem item)
{
    return new Control<TItem>(item);
}

我无法理解这一限制背后的原因。有人可以解释吗?

构造函数还不支持泛型类型推断。它们要求您显式列出类型的泛型参数。当泛型参数是匿名类型时,即使您愿意,也不可能这样做


泛型方法支持泛型参数的类型推断。这并不总是可能的,但通常是可能的,就像这里的情况一样。

,您得到的错误消息应该是关于问题的描述。@Kyle区别在于,对于命名类型,您可以显式地提供泛型参数。它可能不会那么简洁,但可以让它发挥作用。对于匿名类型,问题变得不可能,而不仅仅是更加冗长。原因是,构造函数的重载解析与方法的重载解析工作方式不同,而支持构造函数的类型推断并没有进入语言,这是我在书中读到的内容,特别是在决定两种类型[…]时选择哪种类型时具有相同的名称但不同的通用算术。@tomp注意到Eric Lippert在评论中已经提到了类似的评论,他说还有很多其他遗漏的推论,并且正在讨论一些可能的案例。基本上,C语言并不是主要的函数式语言,所以这个特性的优先级不高这一事实并不令人惊讶。
static Control<TItem> CreateControl<TItem>(TItem item)
{
    return new Control<TItem>(item);
}