非泛型声明不允许有约束

时间:2014-08-22 07:05:54

标签: c# .net generics

我已经看过其他类似问题,但问题是语法错误。也许我错过了一些东西,但据我所知,我的语法看起来是正确的。 我试图按如下方式声明一个方法:

internal IDictionary<string, T> FillObjects(
    IReadableRange<T> svc,
    Func<T, string> getKey) where T : BaseEntity
{
}

但是我收到编译错误:

  

非泛型声明不允许使用约束

任何想法?

感谢

马特

5 个答案:

答案 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 TFillObjects' {之间的歧义{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
{
}