0

我有一堆代码,其中包含许多具有不同含义的整数(我宁愿使用通用解决方案,但对于一个具体示例:每月的一天与一年中的月份与年份等)。我希望能够根据这些含义重载类构造函数。

例如

int a; // takes role A
int b; // takes role B

var A = new Foo(a);  // should call one constructor
var B = new Foo(b);  // should call another constructor

现在显然这行不通,但如果我可以定义一个类型(不仅仅是别名),int除了这样的名称之外,它是一个类型:

typedef int TypeA;  // stealing the C syntax
typedef int TypeB;

我可以做我需要的重载,让类型系统跟踪什么是什么。特别是,这将允许我确保值不会混淆,例如从函数返回的值作为年份不用作月份中的日期。

在 c# 中是否有任何方法classstruct包装器可以做到这一点?


如果该解决方案也适用于浮点数和双精度数,那就太好了。

4

4 回答 4

13

没有直接的 typedef 等效项,但您可以执行以下操作:

using TypeA = int;
using TypeB = int;

但是,这只是给类型起别名,而不是创建新的强类型。因此,编译器仍会将它们视为int解析方法调用的时间。

更好的解决方案可能是创建简单的包装类来包装int并提供隐式转换,例如:

struct TypeA
{
   public TypeA(int value)
   {
      this.realValue = value;
   }

   private int realValue;
   public static implicit operator int(TypeA value)
   {
     return this.realValue;
   }

   public static implicit operator TypeA(int value)
   {
     return new TypeA(value);
   }
}

但是,在大多数情况下,anenum会更合适。

于 2009-02-18T20:58:28.970 回答
6

这可能很遥远,但你不能为此使用枚举吗?Enum base 是 int,但是是有类型的,你可以根据传递的 enum 的类型定义不同的构造函数。

于 2009-02-18T20:44:03.573 回答
2

如果它只是用于构造函数,你不能使用这样的东西:

 int dom = 5;
int doy = 100;

Foo b = Foo.NewFromDayoftheMonth(dom);

Foo c = Foo.NewFromDayoftheYear(doy);

其中每个方法都是静态的,并根据传入的参数创建一个新的 Foo 对象。

这对我来说似乎是一个解决方案,没有太多其他的解决方案。

于 2009-02-18T20:51:34.883 回答
0

我还将围绕值创建一个结构:

public struct TypeA
{
  private int value;
  public TypeA(int value)
  {
    this.value = value;
  }

  public static explicit operator int(TypeA a)
  {
     return a.value;
  }

  public static explicit operator TypeA(int value)
  {
     return new TypeA(value);
  }
}

您还可以声明运算符来组合类型和方法,以围绕 int 值提供丰富的类型。

Year 类型可以提供一个IsLeap属性,一个月中的一天可以限制为 1 到 31 之间的值并提供特殊的算术。

于 2009-02-18T21:12:04.537 回答