是否可以在c#中创建一个新的Type ?

本文关键字:一个 Type 创建 是否 | 更新日期: 2023-09-27 18:11:06

我想创建一个新类型,即:

[sbyte  (1 Byte) Value-range :        -128 to +127]
[byte   (1 Byte) Value-range :           0 to +255]    
[short  (2 Byte) Value-range :      -32768 to +32767]
[ushort (2 Byte) Value-range :           0 to +65535]    
[int    (4 Byte) Value-range : -2147483648 to +2147483647]
[uint   (4 Byte) Value-range :           0 to +4294967295]
.
.
.
etc.

现在我想在0到200000的范围内创建LInt(LowInt)类型,所以我不想使用int或int。

c#有可能吗?

谢谢!

是否可以在c#中创建一个新的Type ?

是的,这就是类的作用。现在,您不能创建新的"内置"类型。语义可能不完全相同,但我猜您不会太在意这些差异。

这是不可能的内置方式,使用简单的语言,例如int<5000,20000>

虽然可以使用更复杂的定义,但这并不容易。很难确定和定义所需的所有语义,例如:

  • 转换为其他范围类型
  • 从内置数字类型转换
  • 溢出/下溢怎么办
  • 在执行算术运算后,结果类型的范围应该是什么

这样的解决方案也不会涵盖您希望一个参数的类型范围基于另一个参数的值进行约束的情况。

另一种选择是使用像Code Contracts这样的东西来定义你的代码契约,这样你就可以做任意的静态(编译时)验证。

Edit:删除SpecSharp的链接。

您也可以使用结构体来创建"类型",但不能创建基本类型

你可以创建一个对象并处理你的条件,如果你想让它更像一个原语,试着把它变成一个struct

没用的。您的CPU体系结构定义了它可以一次处理哪些数据块以及用于什么目的。即使您创建的类型只允许不同的最小-最大值(您可以在类和操作符重载中实现),它也不会在内存和性能方面更有效。

如果您想简单地强制执行一些语义,这里有一些东西应该会引导您正确的方向(它绝不是完整的,并且缺乏对选中的未选中的关键字的支持)。

struct MyInt
{
    static uint max = 200000;
    readonly uint i;
    public MyInt(uint i) {
        this.i = i;
    }
    public static implicit operator MyInt(uint j) {
        if(j > max)
            throw new ArgumentException();
        return new MyInt(j);
    }
    public static MyInt operator +(MyInt i, uint j) {
        try {
            return new MyInt(i.i + j);
        }
        catch(ArgumentException) {
            throw new OverflowException();
        }
    }
    public override string ToString ()
    {
        return i.ToString();
    }
}