程晓晖

博客园 首页 新随笔 联系 订阅 管理

implicit关键字用于声明隐式的用户定义类型转换运算符。(explicit反之)
static implicit operator target_type { source_type identifier }
隐式转换可以通过消除不必要的类型转换来提高源代码的可读性。但是,因为可以在未指定的情况下发生隐式转换,因此必须注意防止令人不愉快的后果。一般情况下,隐式转换运算符应当从不引发异常并且从不丢失信息,以便可以在不知晓的情况下安全使用它们。如果转换运算符不能满足那些条件,则应将其标记为 explicit。 

下边是在网上找的几个简单例子

例1

class Digit
    {
        public Digit(double d) { val = d; }
        public double val;
   

        // User-defined conversion from Digit to double
        public static implicit operator double(Digit d)
        {
            return d.val;
        }
        //  User-defined conversion from double to Digit
        public static implicit operator Digit(double d)
        {
            return new Digit(d);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Digit dig = new Digit(7);
            //This call invokes the implicit "double" operator
            double num = dig;
            //This call invokes the implicit "Digit" operator
            Digit dig2 = 12;
            Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
            Console.ReadLine();
        }
    }

例2

//基本数据类型到用户自定义类型
class   Distance
{
    private   int   feet;
    private   double   inches;
    
    //默认构造函数
    public   Distance()    
    {
        feet   =   0;   
        inches   =   0.0;
    }    
        
    //带有单参数的构造函数             
    public   Distance(double   metres)
    {    
        double   f;
        f   =   3.28   *   metres;
        this.feet   =   (int)f;
        this.inches   =   12   *   (f   -   feet);
    }
 
    //由一个double隐式构造一个Distance
    public   static   implicit   operator   Distance(double   metres)
    {
        return   new   Distance(metres);
    }
 
    //由一个Distance显式返回一个double
    public   static   explicit   operator   double(Distance   d)
    {
        double   metres;
        metres   =   d.inches   /   12   +   (double)d.feet;
        return   (metres   /   3.28);
    }
 
    public   override   string   ToString()
    {
        return   String.Format( "{0}英尺{1}英寸 ",   this.feet,   this.inches);
    }
 
}
 
class   DistanceDemo
{
    public   static   void   Main()
    {
        Distance   d1   =   1.25;    
        Console.WriteLine(d1);
 
        double   d   =   (double)d1;
        Console.WriteLine(d);
    }
}

例3

using System;

namespace Hunts.Keywords

{

    // 定义一个人民币结构。数据类型转换的语法对于结构和类是一样的

    public struct RMB

    {

        // 注意:这些数的范围可能不能满足实际中的使用

        public uint Yuan;

        public uint Jiao;

        public uint Fen;

        public RMB(uint yuan, uint jiao, uint fen)

        {

            if (fen > 9)

            {

                 jiao += fen / 10;

                 fen = fen % 10;

             }

            if (jiao > 9)

            {

                 yuan += jiao / 10;

                 jiao = jiao % 10;

             }

            this.Yuan = yuan;

            this.Jiao = jiao;

            this.Fen = fen;

         }

        public override string ToString()

        {

            return string.Format("¥{0}元{1}角{2}分", Yuan, Jiao, Fen);

         }

        // 一些操作

        public static RMB operator +(RMB rmb1, RMB rmb2)

        {

            return new RMB(rmb1.Yuan + rmb2.Yuan, rmb1.Jiao + rmb2.Jiao, rmb1.Fen + rmb2.Fen);

         }

        public static implicit operator float(RMB rmb)

        {

            return rmb.Yuan + (rmb.Jiao/10.0f) + (rmb.Fen/100.00f);

         }

        public static explicit operator RMB(float f)

        {

            uint yuan = (uint)f;

            uint jiao = (uint)((f - yuan) * 10);

            uint fen = (uint)(((f - yuan) * 100) % 10);

            return new RMB(yuan, jiao, fen);

         }

        // more

     }

    class App

    {

        static void Main()

        {

             RMB r1, r2, r3, r4;

            // 记得小学时的某次捐款,我把口袋里藏好的一块钱加6张一毛钱以及13个一分钱的硬币都贡献出去了:(

             r1 = new RMB(1, 6, 13);

            // 其实当时其他人都已经交过了,他们总共交了:

             r2 = new RMB(46, 9, 3);

            // 那么加上我的就是:

             r3 = r1 + r2;

             Console.WriteLine("r3 = {0}", r3.ToString());

            // 隐式转换

            float f = r3;

             Console.WriteLine("float f= {0}", f);

            // 显式转换

             r4 = (RMB)f;

             Console.WriteLine("r4 = {0}", r4.ToString());

            //如果不进行显示转换,将出现错误 CS0266: 无法将类型“float”隐式转换为“Hunts.Keywords.RMB”。存在一个显式转换(是否缺少强制转换?)

             Console.Read();

         }

     }

}

posted on 2010-12-22 21:31  fumen  阅读(11757)  评论(2编辑  收藏  举报