如何将T约束为无符号积分
本文关键字:无符号 约束 | 更新日期: 2023-09-27 18:29:52
我一直在尝试以下
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'.
tldr这种方法行不通。
C#使用主格类型系统(类型由名称决定),而不是结构类型系统(由数据/运算决定的类型)。
unit32
和IUIntegral
不相关:即使它们共享相同的结构。
(他们无论如何都不符合,uint32
不符合IEquatable<byte>
。)
如果一个类型需要与自身相等,这可以通过引用类型限制中的类型来实现:
class Counter<T> where T : IEquatable<T> {
T _value;
}