【发布时间】:2015-01-08 22:05:46
【问题描述】:
假设我有以下泛型类:
public class Control<TItem>
{
public Control(TItem item)
{
}
}
当我尝试将匿名类型的对象传递给构造函数时,编译失败:
var objectOfAnonymousType = new { Foo = "bar" };
// cannot compile:
var control1 = new Control(objectOfAnonymousType);
但是,如果我不是通过构造函数,而是通过类之外的通用方法,它似乎可以工作:
// can compile:
var control2 = CreateControl(objectOfAnonymousType);
使用的工厂方法:
static Control<TItem> CreateControl<TItem>(TItem item)
{
return new Control<TItem>(item);
}
我无法理解这种限制背后的原因。谁能解释一下?
【问题讨论】:
-
您收到的错误消息应该非常详细地说明问题所在。
-
@Kyle 不同之处在于,使用命名类型,您将能够显式提供泛型参数。它不会那么简洁,但它可以工作。对于匿名类型,问题变得不可能,而不仅仅是更冗长。
-
原因是 “因为构造函数的重载解析与方法的工作方式不同,并且支持构造函数的类型推断并没有使其成为语言” 是我读到的Why can't the C# constructor infer type?,尤其是当“两种类型[..]具有相同的名称但不同的泛型”时决定选择哪种类型。
-
@tomp 请注意,Eric Lippert 已经在 stackoverflow.com/questions/3570167/… 中对类似的评论发表了评论,他说还有很多其他缺失的推论(还有 article 谈论一些可能的情况)。基本上,C# 不是主要的函数式语言,因此这一特定功能不是高优先级这一事实并不令人惊讶。
标签: c# generics anonymous-types