using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
    enum orientation : byte
    {
        north = 1,
        south = 2,
        east = 3,
        west = 4
    }    struct route
    {
        public orientation direction;
        public double distance;
    }    class Program
    {
        static void Main(string[] args)
        {
            route myRoute;
            int myDirection = -1;
            double myDistance;
            Console.WriteLine("1.东\n2.南\n3.西\n4.北");
            do
            {
                Console.WriteLine("请选择一个方向:");
                myDirection = int.Parse(Console.ReadLine());
            }
            while ((myDirection < 1) || (myDirection > 4));
            Console.WriteLine("输入一个距离:");
            myDistance = double.Parse(Console.ReadLine());
            myRoute.direction = (orientation)myDirection;
            myRoute.distance = myDistance;
            Console.WriteLine("方向:{0}  距离:{1}", myRoute.direction, myRoute.distance);
        }
    }
}myRoute.direction = (orientation)myDirection;是用转换值,然后赋给枚举的。
但是,orientation myDirection = (orientation)Enum.Parse(typeof(orientation),myDirection是不是也能用来赋值前的转换。
《C#入门经典》说:
     当然,这里必须小心。因为并不是所以的byte类型变量的值都可以映射为已定义的orientation值。orientation类型可以存储其他byte的值,所以不会直接产生一个错误,但会在应用程序的后面违反逻辑。这句话的意思是不是,如果用(orientation)myDirection这种方法转换不注意的话,会引起违反逻辑?

解决方案 »

  1.   

    orientation myDirection = (orientation)Enum.Parse(orientation,myDirection);
      

  2.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication40
    {
        class Program
        {
            enum orientation : byte
            {
                north = 1,
                south = 2,
                east = 3,
                west = 4
            }        static void Main(string[] args)
            {
                String myDirection = "1";
                orientation direction = (orientation)Enum.Parse(typeof(orientation), myDirection);
                Console.WriteLine(direction);            myDirection = "5";
                direction = (orientation)Enum.Parse(typeof(orientation), myDirection);
                Console.WriteLine(direction);            Console.Read();
            }
        }
    }
    1会输出north 
    如果是不小心转换个5会样输出个5,虽然不会出错,但明显不符合逻辑,本来想要输出一个方向却输出一个数字
      

  3.   

    因为orientation本质上枚举就是一个只读的byte,所以说“类型可以存储其他byte的值”,转换时不会发现错误
    可以(orientation)100000都没问题