为什么动态没有假设它可以支持这种操作?

时间:2014-06-24 17:26:43

标签: c# dynamic

我有一个这样的课程:

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

我试图像这样实例化这个类:

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

我收到这样的错误:

  

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

MSDN文档说明如下:

  

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

有什么我想念的吗?有关如何解决此问题的任何想法?

3 个答案:

答案 0 :(得分:6)

考虑Repository<T>中的非动态代码。它可能有:

IRepositoryEntry entry = new T();

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

您可以对dynamic类型的值执行任何操作,但这并不意味着您可以在每种情况下都使用dynamic - 而泛型正是一个例子工作

重要的是,“dynamic-ness” only 会影响代码,该代码知道(在编译时)它正在使用dynamic ...因此不会例如,此处包含Repository<T>代码。

答案 1 :(得分:3)

根据错误,Repository<T>要求T实施IRepositoryEntry。但是,dynamic无法证明它确实实现了该接口。

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

答案 2 :(得分:0)

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