4

2つの値を持つ(基になるタイプの)列挙型intと、そのタイプのパラメーターを受け取るメソッドがあります。列挙型にint値をキャストして、メソッドに渡すことはできますか?もしそうなら、列挙型の利点は何ですか?利用可能な値の選択を制限することになっているのではありませんか?

class Program
{
    public void Greeting(MyCode code)
    {
        Console.WriteLine(code);
    }

    static void Main(string[] args)
    {
        var p = new Program();
        var m = new MyCode();

        m = (MyCode) 3;
        p.Greeting(m);
    }
}

public enum MyCode:int
{
   Hello =1,
   Hai
}
4

3 に答える 3

7

はい、基になるタイプの任意の値をキャストできます。その意味で、列挙型は制限型ではありません。

列挙型を使用する利点は次のとおりです。

  • 読みやすさ
  • 明示的にキャストしない場合の正しさ
  • リフレクションなどを介して値にアクセスする機能

より多くのタイプも役立つことに同意しますが、C#には存在しません。制限された値のセットを許可する独自のクラスベースの「疑似列挙型」をC#で構築できますが(プライベートコンストラクターを使用)、次のようになります。

  • それらをnull不可にすることはできません
  • それらをオンにすることはできません
  • 定数値(オプションのパラメーターのデフォルトなど)には使用できません
  • 値は常に参照であり、メモリ使用量に影響を与える可能性があります(たとえば、基になるタイプのバイトを持つ列挙型と比較して)
  • シリアル化に直面して制限された値を保持することは興味深いです

一方、このようなタイプは多形的に動作し、単純な列挙型よりも多くの情報を持っている可能性があり、これは便利です。

于 2012-05-28T11:14:27.150 に答える
6

ジョンの答えに追加するだけです:あなたはいつでも使うことができます

Enum.IsDefined(typeof(MyCode), value)

提供された値が列挙型定義に存在するかどうかを確認します。

于 2012-05-28T11:19:21.320 に答える
2

多くの点で、列挙型は.NET言語のシンタックスシュガーとして実装されます。引用するには、

enumキーワードは、列挙型を宣言するために使用されます。列挙型は、列挙型リストと呼ばれる名前付き定数のセットで構成される別個の型です。

言い換えると、列挙型の値は他のフィールドと同じようにフィールドであり、値の完全な選択ではありません。無効な値を列挙型にキャストすることを妨げるものは何もありません。列挙型の有効なコンテンツを強制的に確認するためにできることのほとんどは、Enum.IsDefined静的メソッドを使用することです(ただし、これが気になる場合は、拡張メソッドを定義することをお勧めします)。

それでも、列挙型の目的はユーザー入力を検証することではないため、列挙型はそれほど厳密である必要はありません。列挙型の目的は、名前を数値に結び付け、この種の可能な組み合わせのリストを簡単に表示することです。Day.Saturday | Day.Fridayそして、それらの緩い構造は、より複雑なカップリングのようなものを可能にすることを忘れないでください。それらはまだ非常に便利です。

于 2012-05-28T11:20:36.197 に答える