非泛型声明不允许有约束

mat*_*tpm 7 .net c# generics

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

internal IDictionary<string, T> FillObjects(
    IReadableRange<T> svc,
    Func<T, string> getKey) where T : BaseEntity
{
}
Run Code Online (Sandbox Code Playgroud)

但我得到编译器错误:

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

有任何想法吗?

谢谢

马特

Eug*_*kal 10

问题是您的方法没有定义泛型类型<T>.它只使用T封闭类型给出的类型.

并且您只能在定义通用参数的同一位置声明约束.

有两种解决方案:

1.,您应该在函数上定义泛型参数:

public class EnclosingType
{
    internal IDictionary<string, T> FillObjects<T>(
        IReadableRange<T> svc,
        Func<T, string> getKey) where T : BaseEntity
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它不会编译,因为你EnclosingType可能EnclosingType<T> 会导致EnclosingType's T和之间的歧义FillObjects' T:

2.,或者您可以在封闭类型上定义约束:

public class EnclosingType<T>
    where T : BaseEntity
{
    internal IDictionary<string, T> FillObjects(
         IReadableRange<T> svc,
         Func<T, string> getKey)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


Yuv*_*kov 6

T在方法名称中缺少(您的泛型类型)的声明。如果它没有在封装类中声明,则必须显式声明它:

internal IDictionary<string, T> FillObjects<T>(
    IReadableRange<T> svc,
    Func<T, string> getKey) where T : BaseEntity
{
}
Run Code Online (Sandbox Code Playgroud)


Eup*_*ric 6

约束需要与泛型参数位于同一位置.因此,如果<T>是课程的一部分,约束需要成为整体的一部分.

class GenericClass<T> where T : BaseEntity
Run Code Online (Sandbox Code Playgroud)

或作为方法的一部分:

T GenericMethod<T>(T param) where T : BaseEntity
Run Code Online (Sandbox Code Playgroud)

你不能只为泛型类中的一个方法创建约束,这是没有意义的.