Могу ли я расширить универсальный класс, установив ограничение на типы, которые можно использовать? - PullRequest
1 голос
/ 24 марта 2012

Я хочу расширить класс IEnumerable, но только для типов, с которыми можно работать (целые, десятичные, одинарные и двойные).

Это выполнимо?Я не вижу способа ограничить это:

public static class IEnumerableExtension
{
    public static decimal FindBestSubsequence<T> (this IEnumerable<T> source, out int startIndex, out int endIndex)
    {

    }
}

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Вы ищете универсальные ограничения , но вы не можете ограничить параметр типа, чтобы он действовал только для определенного набора типов. Самое близкое, что вы могли бы прийти, было бы что-то вроде:

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>? Что бы пошло не так, если бы его использовали для этого?

Вы могли бы иметь набор неуниверсальных общих перегрузок, которые затем вызывались к ограниченному универсальному приватному методу:

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
{
}
1 голос
/ 24 марта 2012

Вы можете ограничить типы значений, используя where T : struct

С MSDN :

, где T: struct

ТипАргумент должен быть типом значения.Можно указать любой тип значения, кроме Nullable.См. Использование обнуляемых типов (Руководство по программированию в C #) для получения дополнительной информации.

...