是否可以在C#中创建一个新类型?

时间:2011-10-11 00:28:26

标签: c# visual-studio-2010

我想创建一个新类型,我。 e:

[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)类型,所以我不想使用uint或int。

C#有可能吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

是的,这就是课程的用途。现在,您无法创建新的“内置”类型。语义可能不完全相同,但我猜你不会太在意这些差异。

答案 1 :(得分:2)

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

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

  • 转换为其他远程类型
  • 从内置数字类型转换
  • 溢出/下溢会发生什么
  • 执行算术后,结果类型的范围应该是什么

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

另一种方法是使用Code Contracts之类的东西来定义代码的契约,这样就可以进行任意静态(编译时)验证。

编辑:删除了指向SpecSharp的链接。看起来它已被代码合同替换......

答案 2 :(得分:0)

您也可以使用结构来创建“类型”,但是您无法创建基本类型。

答案 3 :(得分:0)

你可以创建一个对象并处理你的条件,如果你想让它更像一个原始的尝试,使它成为一个结构

答案 4 :(得分:0)

没用。您的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();
    }
}