2017-01-26 4 views
0

私はライブラリを持っています。この例で列挙型でオブジェクトを作成する必要がないのはなぜですか?

namespace Defintnions 
{ 
    public class skywave 
    { 
     public enum partnum : byte { assembled, configured }; 
     public readonly string partnum_assembled = "1234B"; 
    } 
} 

私は同じソリューションでこの他のプロジェクトでテストしています。

using Defintnions; 


namespace ConsoleApplication1 
{ 
    class MainEntry 
    { 

     static void Main(string[] args) 
     { 
      string test3 = skywave.partnum.Assembled.ToString(); //assembled 

      string zxcv = skywave.partnumAssembled; //doesnt compile 
      skywave obj = new skywave();    
      string asdf = obj.partnumAssembled;  //1234B 

      Console.WriteLine(test3); 
      Console.WriteLine(asdf); 
      Console.ReadKey(true); 
     } 
    } 
} 

test3がローカルenumオブジェクトの作成を必要としない、なぜ私は混乱しています。

私はそれが非常にきれいだと思います。これは、何か似たようなことがあるかどうか疑問に思っていますが、代わりにenumの出力を英数字にしてください。

理想的には、ライブラリを次のようにすることができますが、最初にオブジェクトを作成するという面倒を避けてください。

string zxcv = skywave.partnum.assembled; //1234B 
+0

'enum'型のフィールドではなく、クラスに' enum'型を定義しています。 – juharr

答えて

1

列挙型はC#の型です。コードでskywaveは、partwaveという列挙型を含むクラスです。あなたはskywaveを参照せずにpartwaveを参照できるようにしたい場合は、クラスの外でそれを定義する必要があります。

public enum partnum : byte { assembled, configured }; 
public class skywave 
{ 
    public readonly string partnum_assembled = "1234B"; 
} 

あなたがskywaveをインスタンス化せずpartnum_assembledを参照できるようにしたい場合は、それを定義する必要がありますstaticとして、あるいはconst

public class skywave 
{ 
    public static readonly string partnum_assembled = "1234B"; 
} 

または

public class skywave 
{ 
    public const string partnum_assembled = "1234B"; 
} 
1

ネストされた型(この場合は列挙型ですが、他のさまざまなネストされた型にも適用されますが)インスタンスのインスタンスからアクセスされるのではなく、含まれているオブジェクト自体を通してアクセスされます。

skywaveの特定の例は、partnumタイプを含んでいません。 skywaveクラス全体に型が含まれているため、その型を通してenumにアクセスします。

enumからstringへの暗黙的な変換はなく、作成する方法もありません。 stringへの暗黙の変換を行うには、独自のカスタムタイプを作成し、Enumパターンをエミュレートする必要があります。

関連する問題