C# 将泛型T限制为特定类型

C# 将泛型T限制为特定类型,c#,generics,C#,Generics,我有以下方法: public static IResult<T, String> Validate<T>(this T value) { } // Validate 公共静态IResult验证(此T值){ }//验证 如何将T限制为Int16、Int32、Int64、Double和String?您只能执行以下操作: public static IResult<T, String> Validate<T>(this T value) where

我有以下方法:

public static IResult<T, String> Validate<T>(this T value) {
} // Validate
公共静态IResult验证(此T值){
}//验证
如何将T限制为Int16、Int32、Int64、Double和String?

您只能执行以下操作:

public static IResult<T, String> Validate<T>(this T value) where T: int
{
    //validate
} 
公共静态IResult验证(此T值),其中T:int
{
//证实
} 

只有类和接口可以用作约束。

此类泛型约束不可用。使用泛型最接近您想要实现的目标是添加以下约束:

public static IResult<T, String> Validate<T>(this T value) 
    : where T IConvertible, IComparable, IComparable<T>, IEquatable<T>
{
    // Validate
}


这不是最好的解决方案,但至少它会给您一点编译时安全性和运行时安全性。

您不能以这种方式限制泛型,只能选择一个类作为约束。您必须创建5个重载,或者找到一个接口,所有这5个东西都共享并使用它。您选择哪个选项将取决于什么
Validate
doe

下面是如何执行重载的

public static IResult<Int16, String> Validate<T>(this Int16 value) {
} // Validate

public static IResult<Int32, String> Validate<T>(this Int32 value) {
} // Validate

public static IResult<Int54, String> Validate<T>(this Int64 value) {
} // Validate

public static IResult<double, String> Validate<T>(this double value) {
} // Validate

public static IResult<String, String> Validate<T>(this String value) {
} // Validate

可能是通过为这些类型创建一个具有5个重载的非泛型方法。无法限制特定于编译时的泛型方法。在这种情况下,泛型没有任何好处,因为您无法从int派生某些东西
public static IResult<Int16, String> Validate<T>(this Int16 value) {
} // Validate

public static IResult<Int32, String> Validate<T>(this Int32 value) {
} // Validate

public static IResult<Int54, String> Validate<T>(this Int64 value) {
} // Validate

public static IResult<double, String> Validate<T>(this double value) {
} // Validate

public static IResult<String, String> Validate<T>(this String value) {
} // Validate
public static IResult<T, String> Validate<T>(this T value) where IConvertible {
} // Validate