.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

.NET告诉我typeloadeexception:违反了类型参数'T'而我的代码显然没有违反它

由于同样的错误,我的项目无法构建。即使我没有使用任何泛型类型的类。它的组装只是参考。

当我删除它的accessor文件时,问题解决了。如果您不需要accessor,删除它可能是一个解决方案。

这个答案可能对某人有用。

发生的情况是Student不实现IEditableObject, GetEditorFor方法可能有where子句,其中T必须是IEditableObject,而您正在传递的TStudent而不是IDataEditor

这就是为什么你得到这个错误,你违反了方法签名发送一个T不是IEditableObject。

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