วิธีการตั้งค่า enum เป็นโมฆะ


194

ฉันมีปัญหา

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

วิธีตั้งค่าเป็น NULL เมื่อโหลด

name = "";
Color color = null; //error

แก้ไข: ฉันไม่ดีฉันไม่ได้อธิบายอย่างถูกต้อง แต่คำตอบทั้งหมดที่เกี่ยวข้องกับ nullable นั้นสมบูรณ์แบบ สถานการณ์ของฉันคือเกิดอะไรขึ้นถ้าฉันได้รับ / ตั้งสำหรับ enum ในชั้นเรียนที่มีองค์ประกอบอื่น ๆ เช่นชื่อ ฯลฯ ในการโหลดหน้าฉันเริ่มต้นชั้นเรียนและพยายามเริ่มต้นค่าเป็นโมฆะ นี่คือสถานการณ์ (รหัสคือ C #):

namespace Testing
{
    public enum ValidColors
    {
        Red,
        Green,
        Yellow
    }

    public class EnumTest
    {
        private string name;
        private ValidColors myColor;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public ValidColors MyColor
        {
            get { return myColor; }
            set { myColor = value; }
        }

    }

    public partial class _Default : System.Web.UI.Page
    {       
        protected void Page_Load(object sender, EventArgs e)
        {
            EnumTest oEnumTest = new EnumTest();
            oEnumTest.Name = "";
            oEnumTest.MyColor = null; //???
        }
    }

}

จากนั้นใช้คำแนะนำด้านล่างฉันเปลี่ยนรหัสข้างต้นเพื่อให้ทำงานกับวิธีการรับและตั้งค่า ฉันแค่ต้องการเพิ่ม "?" ในคลาส EnumTest ระหว่างการประกาศตัวแปร enum ส่วนตัวและในเมธอด get / set:

public class EnumTest
{
    private string name;
    private ValidColors? myColor; //added "?" here in declaration and in get/set method

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public ValidColors? MyColor
    {
        get { return myColor; }
        set { myColor = value; }
    }

}

ขอบคุณทุกคำแนะนำที่น่ารัก


คำตอบ:


374

คุณสามารถใช้ "?" ตัวดำเนินการสำหรับชนิด nullable

public Color? myColor = null;

หรือใช้แนวปฏิบัติมาตรฐานสำหรับ enums ที่ไม่สามารถเป็นโมฆะได้โดยการมีค่า FIRST ใน enum (aka 0) เป็นค่าเริ่มต้น ตัวอย่างเช่นในกรณีของสีไม่มี

public Color myColor = Color.None;

@equiman ไม่จำเป็นต้องส่งเนื่องจากมีการระบุประเภททางด้านซ้ายคุณจะทำซ้ำส่วนแรกของคำตอบของฉันที่ได้รับการยอมรับแล้ว
Rodney S. Foley

7
นี่ตอบคำถามของฉัน: คุณสามารถเพิ่ม '?' การ enumname เพื่อทำให้เป็นโมฆะ?
LuckyLikey

สำหรับผู้ที่มีประเภท nullable แล้วประกาศในชั้นเรียนของพวกเขาและมาที่นี่: myColor = (Color?) null;
StefanJanssen

@StefanJanssen คุณไม่จำเป็นต้องส่งค่า null หากเป็นสีประเภท nullable ที่ประกาศแล้ว just myColor = null ใช้ได้
Rodney S. Foley

ฉันไม่ทราบว่าปัญหาคืออะไร แต่สำหรับคอมไพเลอร์ของฉันมันให้ข้อผิดพลาดจนกว่าฉันจะโยน
StefanJanssen

43

หากนี่คือ C # จะไม่ทำงาน: enums เป็นประเภทค่าและไม่สามารถเป็นnullได้

ตัวเลือกปกติคือการเพิ่มNoneสมาชิก:

public enum Color
{
  None,
  Red,
  Green,
  Yellow
}

Color color = Color.None;

... หรือใช้Nullable:

Color? color = null;

24

ทำให้ตัวแปรของคุณเป็นโมฆะ ชอบ:

Color? color = null;

หรือ

Nullable<Color> color = null;

9

Enum คือประเภท "value" ใน C # (หมายถึง enum ถูกเก็บไว้เป็นค่าอะไรก็ตามไม่ใช่การอ้างอิงไปยังสถานที่ในหน่วยความจำที่เก็บค่าไว้) คุณไม่สามารถตั้งค่าประเภทเป็นโมฆะ (เนื่องจากเป็นค่าว่างสำหรับประเภทการอ้างอิงเท่านั้น)

ที่ถูกกล่าวว่าคุณสามารถใช้สร้างขึ้นในNullable<T>ระดับที่ตัดค่าประเภทเช่นที่คุณสามารถตั้งค่าให้เป็นโมฆะตรวจสอบว่าและได้รับที่แท้จริงของมันHasValue Value(นั่นเป็นวิธีการทั้งสองบนNullable<T>วัตถุ

name = "";
Nullable<Color> color = null; //This will work.

นอกจากนี้ยังมีทางลัดที่คุณสามารถใช้:

Color? color = null;

นั่นคือเช่นเดียวกับNullable<Color>;


3

ฉันสมมุติว่า c ++ ตรงนี้ หากคุณใช้ c # คำตอบอาจเหมือนกัน แต่ไวยากรณ์จะแตกต่างกันเล็กน้อย enum เป็นชุดของค่า int มันไม่ใช่วัตถุดังนั้นคุณไม่ควรตั้งค่าเป็นโมฆะ การตั้งค่าบางอย่างให้เป็นโมฆะหมายความว่าคุณกำลังชี้ตัวชี้ไปยังวัตถุเพื่อกำหนดศูนย์ คุณไม่สามารถทำอย่างนั้นกับ int สิ่งที่คุณต้องการทำกับ int ก็คือตั้งค่าให้เป็นค่าที่ปกติคุณจะไม่มีเพื่อให้คุณสามารถโทรหาได้ถ้ามันคุ้มค่าหรือไม่ ดังนั้นตั้งค่าสีของคุณเป็น -1

Color color = -1;

หรือคุณสามารถเริ่ม enum ของคุณที่ 1 และตั้งค่าเป็นศูนย์ หากคุณตั้งค่าสีเป็นศูนย์อย่างที่เป็นอยู่ตอนนี้คุณจะตั้งค่าเป็น "สีแดง" เนื่องจากสีแดงเป็นศูนย์ใน enum ของคุณ

ดังนั้น,

enum Color {
red =1
blue,
green
}
//red is 1, blue is 2, green is 3
Color mycolour = 0;

0

การกำหนดค่า 0 ให้เป็นNone ค่าคงที่จะไม่ดีกว่าหรือไม่ ทำไม?

เพราะเริ่มต้นenumค่าเท่ากับ 0 หากคุณจะเรียกมันจะพิมพ์default(Color)None

เนื่องจากเป็นตำแหน่งแรกการกำหนดค่าตามตัวอักษร 0 ให้กับค่าคงที่อื่น ๆ จะเปลี่ยนพฤติกรรมดังกล่าวการเปลี่ยนลำดับการเกิดจะเปลี่ยนผลลัพธ์ของdefault(Color)( https://stackoverflow.com/a/4967673/8611327 )


-2
Color? color = null;

หรือคุณสามารถใช้

Color? color = new Color?();

ตัวอย่างที่กำหนด null จะไม่ทำงาน

color = x == 5 ? Color.Red : x == 9 ? Color.Black : null ; 

เพื่อให้คุณสามารถใช้:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.