C# 在C语言中重写泛型约束#

C# 在C语言中重写泛型约束#,c#,generics,C#,Generics,如果这更适合软件工程堆栈交换,我深表歉意,但由于这是相当特定于语言的,我相信我的要求是正确的 我有一个项目,涉及将一个相当大的代码库从Java转换成C。最初的Java项目有一个大致相当于以下C#snippet的接口 公共接口IEntry,其中T:class,IEntry{ T SetName(字符串nameIn); 字符串GetName(); } 它还包含此接口的基本实现 公共抽象类BaseEntry:IEntry其中T:BaseEntry{ 私有字符串名称; 内部对象外部数据; public

如果这更适合软件工程堆栈交换,我深表歉意,但由于这是相当特定于语言的,我相信我的要求是正确的

我有一个项目,涉及将一个相当大的代码库从Java转换成C。最初的Java项目有一个大致相当于以下C#snippet的接口

公共接口IEntry,其中T:class,IEntry{
T SetName(字符串nameIn);
字符串GetName();
}
它还包含此接口的基本实现

公共抽象类BaseEntry:IEntry其中T:BaseEntry{
私有字符串名称;
内部对象外部数据;
public T SetName(字符串nameIn){
name=nameIn;
返回(T)这个;
}
公共字符串GetName(){
返回名称;
}
}
问题出现在类中,该类包含实现
IEntry
接口的类型的条目

公共类ObjectHolder,其中T:class,IEntry{
私有只读列表条目;
私人只读文件canGetExtraData;
公共对象持有者(){
//HasGenericBaseType只是检查第一个类型是否实现了第二个类型
canGetExtraData=HasGenericBaseType(typeof(T),typeof(BaseEntry));
}
公共无效添加(T条目){
条目。添加(条目);
}
公共空间剂量测定(整数指数){
如果(!canGetExtraData){
T条目=条目[索引];

objectextradata=((BaseEntry)entry)。extraData;因此基本上
BaseEntry
不等于
IEntry

类比:您有一个实现了
ILegs
哺乳动物,但并不是所有具有
ILegs
的东西都是
哺乳动物


您可能想查看的修复程序很少,要么将
extraData
推回到
IEntry
,要么按照@的建议,为
IExtraData
创建一个单独的通用或/非通用接口并加以约束。答案将取决于
IEntry
是否总是有额外的数据。

您能澄清为什么吗你不能使用类限制,而是在运行时执行它?(显然,你已经看到了大量的答案,说明了如何使用
(object)
在施法时绕过错误…所以不要重复关闭)所以
BaseEntry
不等于
IEntry
你有一个实现
ILegs
的哺乳动物。但并不是所有拥有
ILegs
的东西都是哺乳动物。你有什么理由不能将
extraData
推回到接口吗?还有其他一些真正可疑的东西,比如HasGenericBaseType。不幸的是,w对于这类问题,一个具体的答案是有问题的,因为我们不知道您试图解决什么问题,将其声明为
T extraData{get;set;}
在接口上?顺便说一句,您描述的整个模式与IMHO非常相似,IMHO定义了一些其他
内部接口IExtraData
,没有通用约束,那么您就不需要向编译器证明
t:BaseEntry
。这将
canGetExtraData
简化为
if(条目[索引]IExtraData是额外的吗…extra.extraData;
因为Java运行时实际上并没有实现泛型,所以它对像这样在边缘情况下强制约束的要求不那么严格。我只是在我的项目中使用extra接口的思想实现了这一点,因为我意识到一些条目不需要额外的数据。感谢这个坚实的类比,这真的让我站到了正确的位置track@user712950祝你好运
error CS0314: The type `T' cannot be used as type parameter `T' in the generic type or method `BaseEntry<T>'. There is no boxing or type parameter conversion from `T' to `BaseEntry<T>'