当前位置:  开发笔记 > 编程语言 > 正文

typedef等效于c#中的重载

如何解决《typedef等效于c#中的重载》经验,为你挑选了2个好方法。

我有一大堆的是具有不同的含义很多的整数代码(我宁愿一个通用的解决方案,但对于一个具体的例子:某一天的 - 月月对比的最年与年等).我希望能够基于这些含义重载类构造函数.

例如

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;

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

有没有办法短的classstruct包装在C#这样做吗?


如果解决方案也适用于浮动和双打,那将是很好的.



1> Jeff Yates..:

没有直接的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);
   }
}

但是,在大多数情况下,enum更合适.



2> Mike_G..:

这可能是关闭,但你不能使用枚举吗?枚举基数是int,但是是键入的,您可以根据传递的枚举类型定义不同的构造函数.


@BCS:枚举值可以取其基本类型的任何其他值.因此,如果枚举基于int,则可以为其分配任何int,即使它只定义了说1和2的名称.您只需在myEnumValue =(MyEnumType)42中进行转换.那不是黑客攻击.
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有