.NET 告诉我 TypeLoadException:违反类型参数“T”的约束,而我的代码显然没有违反它
Posted
技术标签:
【中文标题】.NET 告诉我 TypeLoadException:违反类型参数“T”的约束,而我的代码显然没有违反它【英文标题】:.NET tells me TypeLoadException: violates the constraint of type parameter 'T' while my code clearly doesn't violate it 【发布时间】:2011-11-21 16:29:33 【问题描述】:我正在尝试初始化DataEditor<Student>
的对象,其中我的DataEditor<T>
类实现interface IDataEditor<T> where T : IEditableObject
。
DataEditor<Student> editor = GetEditorFor(student);
在运行时,我得到一个 TypeLoadException 说: GenericArguments[0], 'Namespace.Data.Student', on 'Namespace.IDataEditor`1[T]' 违反了类型参数 'T' 的约束。 异常发生在上一行之前它甚至进入了 GetEditorFor 方法。
对T的唯一约束是IEditableObject
,而我的Student
类清楚地实现了它(我仔细检查了接口拼写、命名空间等),而且编译器也没有给我任何错误,所以我不知道为什么会在运行时发生此错误。
如果我删除IEditableObject
约束,代码运行时不会出现此异常,但我的逻辑取决于类是IEditableObject
,所以它不是一个选项。
知道为什么会发生这种情况以及如何解决吗?
这些页面好像有关系,但我还是不知道解决办法
https://connect.microsoft.com/VisualStudio/feedback/details/270717/reflection-emit-chokes-on-method-type-parameters http://bytes.com/topic/c-sharp/answers/478595-reflection-generics-could-anyone-confirm-deny-bug这是 .NET 中的错误吗?有没有人找到解决方法?
编辑:按要求声明
public class DataEditor<T> : ViewModel, IDataEditor<T> where T : IEditableObject
public interface IDataEditor<T> : IDataEditor
where T : IEditableObject
【问题讨论】:
能否将类声明同时粘贴到 IDataEditor 和 DataEditor 上? 所有这些类/接口都在同一个程序集中吗?你能用一个简单的重现来重现这个问题吗(从 VS 中的 File->New Project 开始)? 我无法用空类重现这一点。你能发布 GetEditorFor() 吗? 这可能是版本问题。删除并重建所有程序集。 Double=检查你没有引用奇怪路径上的东西 同时检查是否没有在 GAC 中注册旧版本...当异常发生时检查 Debug->Modules 以获取奇怪的模块位置。 【参考方案1】:由于同样的错误,我的项目无法构建。即使我没有使用任何这个泛型类型类。它的程序集刚刚被引用。
当我删除它的accessor
文件时,问题解决了。如果您不需要accessor
,删除它可能是一个解决方案。
这个答案可能对某人有用。
【讨论】:
【参考方案2】:发生的情况是Student
没有实现IEditableObject
,GetEditorFor
方法可能有一个where
子句,其中T
必须是IEditableObject
,而您传递的T
是@ 987654328@而不是IDataEditor
。
这就是您收到此错误的原因,您违反了发送不是 IEditableObject 的 T
的方法签名。
您应该在Student
class 中实现IEditableObject
,或者删除where T : IEditableObject
子句。
【讨论】:
OP 明确指出Student
类实现 IEditableObject
并且删除类型约束也不是一个选项。以上是关于.NET 告诉我 TypeLoadException:违反类型参数“T”的约束,而我的代码显然没有违反它的主要内容,如果未能解决你的问题,请参考以下文章
如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举