C#, упаковывающий перечислимую ошибку с дженериками

def chunk(input, size):
    return map(None, *([iter(input)] * size))
5
задан 23 June 2009 в 07:25
поделиться

4 ответа

Во-первых, я не уверен, разумно ли использовать IComparable с перечислением ... IEquatable , конечно - но сравнение?

Как более безопасная альтернатива; вместо того, чтобы назначать IComparable общим ограничением, возможно, используйте Comparer .Default внутри класса. Это имеет то преимущество, что поддерживает IComparable и IComparable - и это означает, что у вас меньше ограничений для распространения.

Например:

public class SomeClass<T> { // note no constraint
    public int ExampleCompareTo(T other) {
        return Comparer<T>.Default.Compare(Stored, other);
    }
    ... [snip]
}

Это отлично работает с перечислением :

SomeClass<TestVal> t = new SomeClass<TestVal>();
t.Stored = TestVal.First;
int i = t.ExampleCompareTo(TestVal.Second); // -1
8
ответ дан 18 December 2019 в 13:18
поделиться

Перечисления не являются производными от System.Int32s - они являются производными от System.Enum, который не реализует IComparable (он реализует IComparable .

Хотя базовым значением перечисления по умолчанию является int, само перечисление - нет. Таким образом, между ними нет преобразования.

5
ответ дан 18 December 2019 в 13:18
поделиться

В перечислениях C # реализуйте IComparable , но не общий IComparable . Я не уверен, почему это так, но, возможно, вы могли бы переключиться на неуниверсальный IComparable в своем предложении where.

0
ответ дан 18 December 2019 в 13:18
поделиться

Enum не реализует IComparable , но реализует IComparable . Таким образом, перечисление может быть буквой T в предложении where, например:

    where T : IComparable

, но это дает ошибку:

    where T : IComparable<T>

И тогда, я полагаю, вы хотите, чтобы SomeClass был сопоставимым. Для этого потребуется реализовать сам IComparable.

Вот пример того и другого (с использованием публичного члена для упрощения кода):

public class SomeClass<T>
    : IComparable<SomeClass<T>>
    where T : IComparable
{
    public T storedval;

    public int CompareTo(SomeClass<T> other)
    {
        return storedval.CompareTo(other.storedval);
    }
}
1
ответ дан 18 December 2019 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: