【问题标题】:Cannot pass anonymous type to generic constructor [duplicate]无法将匿名类型传递给泛型构造函数[重复]
【发布时间】: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


【解决方案1】:

构造函数不支持泛型类型推断(目前)。它们要求您明确列出该类型的通用参数。当泛型参数是匿名类型时,你不可能这样做,即使你想这样做。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多