如何将T约束为无符号积分?

Nic*_*pat 2 c# type-constraints

我一直在尝试以下方面

interface IUIntegral : IEquatable<Byte>, IEquatable<UInt16>, IEquatable<UInt32>, IEquatable<UInt64> { }
class Counter<T> where T : IUIntegral {
    T _value;
}
Run Code Online (Sandbox Code Playgroud)

使用此调用代码

Counter<UInt32> foo = null;
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个编译错误

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'.
Run Code Online (Sandbox Code Playgroud)

小智 5

tldr; 这种方法不起作用.

C#使用主格类型系统(类型是由名字确定的)和不是一个结构类型系统(由数据/操作来确定类型).

unit32并且IUIntegral没有关系:即使它们共享相同的结构.

(他们不管,uint32不符合IEquatable<byte>.)

如果类型需要与自身相等,则可以通过引用类型限制中的类型来完成:

class Counter<T> where T : IEquatable<T> {
    T _value;
}
Run Code Online (Sandbox Code Playgroud)