您正在寻找generic constraints,但您不能将类型参数限制为仅对特定类型集有效。你最接近的可能是这样的:
public static decimal FindBestSubsequence<T>
(this IEnumerable<T> source, out int startIndex, out int endIndex)
where T : struct, IConvertible, IFormattable, IComparable<T>, IEquatable<T>,
IComparable
... 因为这些都是这些类型中的每一个都实现的接口。但是,这不会阻止 Int16 被用作类型参数。您肯定不希望它适用于IEnumerable<short>?如果用于此会有什么问题?
您可以拥有一组非泛型公共重载,然后调用受约束的泛型 private 方法:
public static decimal FindBestSubsequence(this IEnumerable<decimal> source,
out int startIndex, out int endIndex)
{
return FindBestSubsequenceImpl(source, startIndex, endIndex);
}
public static decimal FindBestSubsequence(this IEnumerable<int> source,
out int startIndex, out int endIndex)
{
return FindBestSubsequenceImpl(source, startIndex, endIndex);
}
// etc
// Could constrain T more if it was useful in the method, but we know
// T will only be one of the types we want, because only this class can
// call this method
private static decimal FindBestSubsequence<T>
(IEnumerable<T> source, out int startIndex, out int endIndex)
where T : struct
{
}