我已经看过其他类似问题,但问题是语法错误。也许我错过了一些东西,但据我所知,我的语法看起来是正确的。 我试图按如下方式声明一个方法:
internal IDictionary<string, T> FillObjects(
IReadableRange<T> svc,
Func<T, string> getKey) where T : BaseEntity
{
}
但是我收到编译错误:
非泛型声明不允许使用约束
任何想法?
感谢
马特
答案 0 :(得分:8)
问题是您的方法没有定义泛型类型<T>
。它只使用封闭类型给出的类型T
。
您只能在the same place where you define generic parameters声明约束。
有两种解决方案:
1。,您应该在函数上定义泛型参数:
public class EnclosingType
{
internal IDictionary<string, T> FillObjects<T>(
IReadableRange<T> svc,
Func<T, string> getKey) where T : BaseEntity
{
}
}
在您的情况下,它无法编译,因为您EnclosingType
可能是EnclosingType<T>
导致EnclosingType's
T
和FillObjects'
{之间的歧义{1}}:
2。,或者您可以在封闭类型上定义约束:
T
答案 1 :(得分:5)
约束需要与泛型参数位于同一位置。因此,如果<T>
是该类的一部分,则约束需要成为整体的一部分。
class GenericClass<T> where T : BaseEntity
或作为方法的一部分:
T GenericMethod<T>(T param) where T : BaseEntity
你不能只为泛型类中的一个方法创建约束,这是没有意义的。
答案 2 :(得分:2)
您在方法名称中缺少T
(您的通用类型)的声明。如果未在封装类中声明它,则必须明确声明它:
internal IDictionary<string, T> FillObjects<T>(
IReadableRange<T> svc,
Func<T, string> getKey) where T : BaseEntity
{
}
答案 3 :(得分:2)
可能T
是您班级的通用参数。您应该将约束应用于类参数。
或者,如果您希望此T
独立于该类,则在您的方法中重新声明它,就像其他答案所说的那样。
答案 4 :(得分:1)
如果T
不是父类FillObjects
的泛型类型参数,那么您需要直接在方法上指定泛型类型参数,如下所示:
internal IDictionary<string, T> FillObjects<T>(
IReadableRange<T> svc,
Func<T, string> getKey) where T : BaseEntity
{
}