Как я могу ограничить T быть беззнаковым интегралом? - PullRequest
2 голосов
/ 02 апреля 2012

Я пробовал следующее

interface IUIntegral : IEquatable<Byte>, IEquatable<UInt16>, IEquatable<UInt32>, IEquatable<UInt64> { }
class Counter<T> where T : IUIntegral {
    T _value;
}

С этим вызывающим кодом

Counter<UInt32> foo = null;

Но я получаю эту ошибку компилятора

Error   1   The type 'uint' cannot be used as type parameter 'T' in the generic type or method 'Test.Counter<T>'. There is no boxing conversion from 'uint' to 'Test.IUIntegral'.

1 Ответ

5 голосов
/ 02 апреля 2012

tldr; Этот подход не будет работать.

C # использует номинативную систему типов (типы определяются именами) и не a структурная система типов (типы определяются данными / операциями).

unit32 и IUIntegral не связаны между собой: , даже если они имеют одинаковую структуру .

(В любом случае, uint32 не соответствует IEquatable<byte>.)

Если тип должен быть Equatable с самим собой, это можно сделать, обратившись к типу в ограничении типа:

class Counter<T> where T : IEquatable<T> {
    T _value;
}
...