【问题标题】:Why is dynamic not making the assumption that it can support this operation?为什么动态不假设它可以支持此操作?
【发布时间】:2014-06-25 01:31:30
【问题描述】:

我有这样的课:

public sealed class Repository<T> : IRepository<T>
    where T : RepositoryEntryBase, IRepositoryEntry, new() 
{
    /*Insert Stuff Here*/
}

我正在尝试像这样实例化这个类:

Repository<dynamic> v = new Repository<dynamic>();

我收到这样的错误:

类型“动态”不能用作泛型类型或方法“ServiceLibraries.Repositories.Repository”中的类型参数“T”。没有从“动态”到“Data.IRepositoryEntry”的隐式引用转换。

不过,MSDN 文档说明如下:

在编译时,假定类型为动态的元素支持任何操作。

我有什么遗漏吗?关于如何解决这个问题的任何想法?

【问题讨论】:

  • 如何定义“IRepository”(其中 T: ...?)
  • 公共接口 IRepository where T : IRepositoryEntry, new()

标签: c# dynamic


【解决方案1】:

考虑Repository&lt;T&gt; 中的非动态代码。它可能有:

IRepositoryEntry entry = new T();

这是完全有效的代码 - 但不适用于 T=dynamic

您可以对 dynamic 类型的值执行任何操作,但这并不意味着您可以在任何情况下使用 dynamic - 而泛型正是其中一个不起作用的示例。

重要的是,“动态性”会影响知道(在编译时)它正在使用dynamic的代码......所以不会 em> 例如,在此处包含 Repository&lt;T&gt; 代码。

【讨论】:

    【解决方案2】:

    基于错误,Repository&lt;T&gt; 要求 T 实现 IRepositoryEntry。但是,dynamic 无法证明它确实实现了该接口。

    就泛型而言,dynamicobject 的同义词,您也不能将 Object 用于类型 T

    【讨论】:

      【解决方案3】:

      当您在类定义中使用“T”时,您指的是泛型类型(不一定是动态类型)。此外,您的类定义强制从 Repository 继承的类型也必须从 RepositoryEntryBase 继承并实现 IRepositoryEntry。动态类型不履行合同

      【讨论】:

        猜你喜欢
        • 2020-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多