82492
自作クラス内でクラス名と同じ型を持つフィールドに対し、値を設定するにはどうすればよろしいでしょうか？  
作成したいもののイメージとしては、System.Windows.Automation 名前空間の ControlType
クラスのようなものを自作したいと考えており、以下のコードはそのソースを参考にして作成したものです。  
無理にキャストしてみたりして、Type.type1 が null にならないように試みてみましたが、うまくいきませんでした。

```

    class Type : TypeIdentifier
    {
        public static readonly Type type1;
        public static readonly Type type2;
        public static readonly Type type3;
    
        static Type()
        {
            type1 = (Type)0x01; // エラー CS0029
            type2 = (Type)0x02; // エラー CS0029
            type3 = (Type)0x03; // エラー CS0029
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Type type = Type.type1; // null
            Console.WriteLine(type.Id);
            Console.WriteLine(type.ProgrammaticName);
        }
    }
    
```
CC BY-SA 4.0
2021-09-14T17:20:33.027
82491
2021-09-14T22:05:31.347
48199
question
c#
自作クラス内でクラス名と同じ型を持つフィールドに対して値を設定するには
`TypeIdentifier`の定義が開示されていないので確実とは言えませんが、`null`以外にしたいのであれば、とりあえず、`type1 = new
Type();`とは書けそうです。

現実に値を持つ`Type`インスタンスを生成したい場合は、`Type`クラスにコンストラクタを作る必要があるでしょう。

```

    static Type()
    {
      type1 = new Type(0x01);
      type2 = new Type(0x02);
      type3 = (Type)0x03; // explicit operator Type(int)の実装が必要
    }
    
    public Type(int value)
    {
      // TypeIdentifierのIdが代入可能な場合
      Id = value;
    
      // { get; } のみ、privateなど、継承クラスから変更ができないようにする・している場合は
      // public Type(int value) : base(value) { } というように基底クラスコンストラクタ
      // 呼び出しを書く。
    }
    
    // int型からの明示キャストを実現したいならexplicit、暗黙ならimplicitで
    // operator Type(int)を定義する
    public static explicit operator Type(int value)
    {
      return new Type(value);
    }
    
```
CC BY-SA 4.0
2021-09-14T22:05:31.347
82492
2021-09-14T22:05:31.347
4684
82491
answer