.NET告诉我typeloadeexception:违反了类型参数'T'而我的代码显然没有违反它
本文关键字:代码 我的 类型参数 typeloadeexception NET 告诉我 | 更新日期: 2023-09-27 18:09:27
我正在尝试初始化DataEditor<Student>
的对象,其中我的DataEditor<T>
类实现了interface IDataEditor<T> where T : IEditableObject
。
DataEditor<Student> editor = GetEditorFor(student);
在运行时,我得到一个typeloadeexception说: GenericArguments[0],"Namespace.Data。"学生",在"命名空间"上。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中的一个bug吗?有人找到解决办法了吗?
编辑:declaration as requested
public class DataEditor<T> : ViewModel, IDataEditor<T> where T : IEditableObject
public interface IDataEditor<T> : IDataEditor
where T : IEditableObject
由于同样的错误,我的项目无法构建。即使我没有使用任何泛型类型的类。它的组装只是参考。
当我删除它的accessor
文件时,问题解决了。如果您不需要accessor
,删除它可能是一个解决方案。
这个答案可能对某人有用。
发生的情况是Student
不实现IEditableObject
, GetEditorFor
方法可能有where
子句,其中T
必须是IEditableObject
,而您正在传递的T
是Student
而不是IDataEditor
。
这就是为什么你得到这个错误,你违反了方法签名发送一个T
不是IEditableObject。
您应该在Student
类中实现IEditableObject
,或者删除where T : IEditableObject
子句。