C#形式继承和泛型约束

C#形式继承和泛型约束,c#,generics,inheritance,forms,constraints,C#,Generics,Inheritance,Forms,Constraints,我正在使用.NETCompactFramework,刚刚开始重构一些UI代码。我正在定义一个基本用户控件来封装公共功能,项目可以编译,但是当我试图在设计模式下打开一个子用户控件时,我得到了一个错误 我将我的类层次结构考虑在内。我的课程是这样的: //on the data layer.. interface IDataObject {} class Foo: IDataObject {} //on the UI layer i have class BaseDataUserControl<

我正在使用.NETCompactFramework,刚刚开始重构一些UI代码。我正在定义一个基本用户控件来封装公共功能,项目可以编译,但是当我试图在设计模式下打开一个子用户控件时,我得到了一个错误

我将我的类层次结构考虑在内。我的课程是这样的:

//on the data layer..
interface IDataObject {}
class Foo: IDataObject {}

//on the UI layer i have
class BaseDataUserControl<TDataObject> : UserControl 
where TDataObject : IDataObject {}

class FooUserControl : BaseDataUserControl<Foo> {}
//在数据层上。。
接口IDataObject{}
类Foo:IDataObject{}
//在UI层上,我有
类BaseDataUserControl:UserControl
其中TDataObject:IDataObject{}
类FooUserControl:BaseDataUserControl{}
这就是我得到的错误:

“BaseDataUserControl`1[TDataObject]”上的GenericArguments[0],“Foo”违反了“TDataObject”类型的约束


有人能告诉我为什么这不起作用吗?

这一定是个歧义问题,编译器在编译FooUserControl时会看到IDataObject的不同定义。这很容易做到,System.Windows.Forms命名空间已经有了IDataObject接口


选择其他名称或键入完整名称空间名称。

这可能是一个歧义问题,编译器在编译FooUserControl时会看到IDataObject的不同定义。这很容易做到,System.Windows.Forms命名空间已经有了IDataObject接口


请选择不同的名称或键入完整的命名空间名称。

从语言角度看,您的代码没有问题。是的,我知道,可能是VS=SAre中的可视化编辑器特有的东西。您确定到处都是相同的IDataObject吗?将光标放置在每个事件上,并在Visual Studio中单击F12以转到其定义。你每次都在同一个地方结束吗?正如@Steven所说,发布的代码很好,所以单靠它不会导致这个问题。@Lasse V.Karlsen我刚刚做了这个练习,是的,它与IDataObject=s相同。从语言的角度来看,你的代码没有问题。是的,我知道,也许这是VS=中的可视化编辑器特有的东西,你确定到处都是相同的IDataObject吗?将光标放置在每个事件上,并在Visual Studio中单击F12以转到其定义。你每次都在同一个地方结束吗?正如@Steven所说,发布的代码很好,所以单靠它不会导致这个问题。@Lasse V.Karlsen我刚刚做了这个练习,是的,它是同一个IDataObject=SOk。我按照你的建议重命名了这个类,但仍然不起作用,所以我只是重新启动了我的计算机(horay表示随机想法!),在那之后,我设法让可视化编辑器显示我的用户控件=),…但令人难过的是=(好吧,我按照你的建议重新命名了这个类,但仍然不起作用,所以我只是重新启动了我的计算机(horay for random ideas!),然后我设法让可视化编辑器显示我的用户控件=),…但令人难过的是=(