1. ホーム
  2. c#

[解決済み] C#のオーバーロードに相当するtypedef

2022-01-31 02:51:51

質問

私は、異なる意味を持つ多くの整数を持つコードの束を持っています(私はむしろ一般的なソリューションを望んでいますが、特定の例については:月の日 vs. 年の月 vs. 年など)。これらの意味に基づいてクラスのコンストラクタをオーバーロードできるようにしたいのです。

例えば

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;

必要なオーバーロードを行い、どのようなものが何であるかを型システムに追跡させることができました。 例えば、ある関数から年として返された値が、月の日として使われることがないように。

を使用しない方法はありますか? class または struct のラッパーを使えば、C#でこれを行うことができますか?


フロートやダブリンの解決策もあればいいのですが。

どのように解決するのですか?

直接の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 の方がより適切でしょう。