web-dev-qa-db-ja.com

列挙型にダッシュ(-)を含めるにはどうすればよいですか?

Enterprise Architectを使用して このスキーマ からビジネスオブジェクトを生成しています。

スキーマには、次の列挙仕様があります。

<xs:simpleType name="PackageMedium">
    <xs:restriction base="xs:string">
        <xs:enumeration value="NTP"/>
        <xs:enumeration value="DAT"/>
        <xs:enumeration value="Exabyte"/>
        <xs:enumeration value="CD-ROM"/>
        <xs:enumeration value="DLT"/>
        <xs:enumeration value="D1"/>
        <xs:enumeration value="DVD"/>
        <xs:enumeration value="BD"/>
        <xs:enumeration value="LTO"/>
        <xs:enumeration value="LTO2"/>
        <xs:enumeration value="LTO4"/>
    </xs:restriction>
</xs:simpleType>

エンタープライズアーキテクトは次のコードを生成しますが、Visual StudioはCD-ROMのダッシュ(-)が気に入らず、コンパイルされません。

public enum PackageMedium : int {
    NTP,
    DAT,
    Exabyte,
    CD-ROM,
    DLT,
    D1,
    DVD,
    BD,
    LTO,
    LTO2,
    LTO4
}

これを機能させるために何ができますか?


@Craig Stuntzの回答に基づいて、私は見つけることができました この記事 これは、列挙型からこれらの特殊文字を取得するのに役立ちました。

19
capdragon

できません。終止符。ただし、回避策があります。たとえば、DescriptionAttributeを使用できます。

public enum PackageMedium : int {
    NTP,
    DAT,
    Exabyte,
    [Description("CD-ROM")]
    CDROM,
    DLT,
    D1,
    DVD,
    BD,
    LTO,
    LTO2,
    LTO4
}

これは、残念ながら、値をマッピングするときにやるべきことがもっとあることを意味します。一方、少なくともコンパイルします。

それが気に入らない場合は、別の回避策、たとえば辞書を選択してください。

var dict = Enum.GetValues(typeof(PackageMedium))
               .Cast<PackageMedium>()
               .Select(v => Tuple.Create(v == PackageMedium.CDROM ? "CD-ROM" : v.ToString(), v))
               .ToDictionary(t => t.Item1, t => t.Item2);

var myEnumVal = dict["CD-ROM"];
18
Craig Stuntz

簡単な答え:いいえ。

その理由は、-文字が、バイナリおよび単項マイナス演算子を表すなどの他の目的でレクサーによってトークンとして使用されるためです。

最善の策は、-を削除するか、識別子名の有効な文字である他の文字に置き換えることです。一般的に使用できる文字以外の文字は_のみです。

詳細については、 C#仕様 を参照してください。

6
Joshua Rodgers

C#識別子は、アンダースコア、UnicodeクラスLu、Ll、Lt、Lm、Lo、またはNlの文字、またはそれらのいずれかのエスケープで始まる必要があります。他のすべての文字は、UnicodeクラスLu、Ll、Lt、Lm、Lo、Nl、Mn、Mc、Nd、Pc、またはCfからのものであるか、これらのいずれかのエスケープである必要があります。

ハイフンマイナスはカテゴリPdです。

C#で許可されていたとしても、CLSに準拠する必要がある場合は、そのルールにも適合しないため、パブリック識別子で使用することはできません。

これも同様です。enumの特定の項目を意味するCD-ROMCD-ROM演算子を適用することを意味する-を、左側のオペランドとしてCDを使用してROMを右側のオペランドとして?

その可能性のリストがハードコーディングされている場合は、ハイフンマイナスを削除し、ラベルとしてCDROMを使用します。ハードコーディングされていない場合は、辞書を使用します。これは、何かが識別子になれない場合がさらに多くなる場合に備えて、復元力があるためです。

1
Jon Hanna