我有一堂课,我这样说:
public class WhereOrCondition<T> : WhereCondition<T>
两个类的泛型类型T
相同。我不确定如何正确声明我的类,以便在WhereOrCondition
中也使用WhereCondition
使用的Generic类型。
以这种方式声明我的课程会给我以下错误:
Error 1 The type 'T' cannot be used as type parameter 'T' in the generic type or method 'BrainStorm.WhereCondition<T>'. There is no boxing conversion or type parameter conversion from 'T' to 'BrainStorm.DatabaseObject'.
关于如何正确宣布我的课程的任何想法?
修改
WhereCondition
类的声明如下:
public class WhereCondition<T> : IEnumerable<KeyValuePair<string, object>> where T : DatabaseObject
答案 0 :(得分:7)
您需要在WhereOrCondition<T>
上放置相同的where条件,使其看起来像
public class WhereOrCondition<T> : WhereCondition<T> where T: DatabaseObject
规则是子类的where子句必须与基类的where子句相同或更严格。
这说WhereOrCondition<T>
对于子类有WhereCondition<T>
,而T
必须是DatabaseObject
(或子类)。
评论public class WhereAndCondition<T> where T: WhereCondition<T>
中的代码完全不同。这表明T
必须是WhereCondition<T>
,这不可能是真的。
答案 1 :(得分:1)
为Ray的答案添加代码:
public class WhereOrCondition<T> : WhereCondition<T> where T : DatabaseObject { }
public class WhereCondition<T> : IEnumerable<KeyValuePair<string, object>> where T : DatabaseObject
{
public IEnumerator<KeyValuePair<string, object>> GetEnumerator() { }
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class DatabaseObject { }
答案 2 :(得分:1)
您没有足够的代码让任何人真正确定您要完成的任务。让我来说明一下。
如果你的意思是“当我创建一个派生类然后'cast'作为它的父类时,我希望T是相等的”,到目前为止您所拥有的代码似乎符合该度量。假设......
public class WhereCondition<T>
{
}
public class WhereOrCondition<T> : WhereCondition<T>
{
}
public class DatabaseObject
{
public int Id { get; set; }
}
您现在可以使用父类和子类,并且在大多数情况下,可以使用您的内容。并且,内部对象将是相同的。
我能想到的唯一可能导致问题的是你是不是真的保持“通用”并且你在其中一个类中输入了T,通过添加“where T:objectType”。
我错过了什么吗?