.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 没有实现IEditableObjectGetEditorFor 方法可能有一个where 子句,其中T 必须是IEditableObject,而您传递的T 是@ 987654328@而不是IDataEditor

这就是您收到此错误的原因,您违反了发送不是 IEditableObject 的 T 的方法签名。

您应该在Studentclass 中实现IEditableObject,或者删除where T : IEditableObject 子句。

【讨论】:

OP 明确指出 Student 类实现 IEditableObject 并且删除类型约束也不是一个选项。

以上是关于.NET 告诉我 TypeLoadException:违反类型参数“T”的约束,而我的代码显然没有违反它的主要内容,如果未能解决你的问题,请参考以下文章

如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举

如何从控制器告诉 ASP.NET Core 视图存在?

如何告诉 VB.NET 应用程序等到文档加载完毕?

如何防止asp.net应用程序会话劫持?

谁能告诉我ASP.NET MVC中,model,view,control层之间到底是啥关系?

哪位高人可以简单的介绍介绍.net 平台???