我有一个这样的课程:
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文档说明如下:
在编译时,假定键入为动态的元素支持任何操作。
有什么我想念的吗?有关如何解决此问题的任何想法?
答案 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
无法证明它确实实现了该接口。
就泛型而言,dynamic
与object
是同义词,您也不能将Object
用于T
类型。
答案 2 :(得分:0)
当您在类定义中使用“T”时,您指的是泛型类型(不一定是动态类型)。此外,您的类定义强制从您的存储库继承的类型还必须从RepositoryEntryBase继承并实现IRepositoryEntry。动态类型不符合该合同