c# implicit explicit关键字(隐式和显式数据类型转换)

implicit关键字用于声明隐式的用户定义类型转换运算符。(explicit反之)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();
        }
    }
}

出处:http://www.cnblogs.com/chengxiaohui/articles/1914190.html

时间: 2024-10-05 07:06:05

c# implicit explicit关键字(隐式和显式数据类型转换)的相关文章

Oracle-35-隐式游标&显式游标

一.游标作用(或定义) 1.PL/SQL提供游标机制处理多行记录结果集: 2.游标类似于指针,使应用程序一次可以处理其中的一行记录,比如将游标放入一个for循环中,每循环一次就处理一行记录,那么循环n次就可以处理n行记录: 3.Oracle中,可以分为显式游标和隐式游标两种,比如select*fromstudent就是用隐式游标进行遍历student表,然后将查询结果展示: 4.在平常在进行SELECT查询.DML操作Oracle都会自动创建声明"隐式游标"来处理结果数据: 6.如果需

android之intent显式,显式学习

intent,意图 当从一个Activity到另一个Activity时调用,这里重点学习显式,隐式的使用 使用语句上的区别: 隐式意图:                 显式意图: setAction                                            跳转到其他应用:setClassName setData 跳转到自己应用:setClass addCategory(当为DEFAULT时可无) 一.无参时的显式.隐式举例 显式-到自己应用(最简单情况): /*

activity的隐式和显式启动

显式Intent(Explicit intent):通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent(Implicit intent):通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间. 显式: Intent intent=new Intent(MainActivity.this,SettingActivity.class); startActivity(

Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载时链接 这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字.当这个应用程序运行时,也就是它的可执行文件

C#接口的隐式和显式实现

1:当类实现一个接口是,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性 2:当类实现多个接口且接口包含相同的方法签名,此时使用显式接口实现.(标示出哪个接口属于哪个方法) 3:隐式接口实现:类和接口都可以访问接口中的方法 4:显式接口实现:只能通过接口访问. 举例如下: ①隐式 1 interface Animal 2 3 { 4 5 void Speak(); 6 7 } 8 9 class Dog:Animal 10 { 11 public void Speak()

安卓突击:隐式、显式Intent

android当中显式intent和隐式intent的区别 定义: Intent定义:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图.作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端. 显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent. 隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent. 说明:Android系统使用IntentFilter 来寻找与隐式Intent

AngularJS中的隐式和显式依赖注入

在之前学习AngularJS的过程中,都是用到了显式依赖注入,比如: <script type="text/javascript"> angular.module('app', []) .controller('Controller1', function($scope) { $scope.something = 'hello world'; }); </script> 依赖注入$scope.这么写有个弊端,在发布的时候,往往要压缩JavaScript代码,压缩

IOS动画隐式,显式,翻页

//  ViewController.m //  IOS动画0817 // //  Created by 张艳锋 on 15/8/17. //  Copyright (c) 2015年 张艳锋. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageview; - (IBA

ABAP:关于隐式与显式的DB Commit

转自http://blog.163.com/[email protected]/blog/static/1394892972011611111559962/#userconsent#1.显式的DB Commit 显式的DB Commit并没有对应的ABAP 语句来执行DB Commit,它是由平常的语句Commit Work来进行的.一个DB LUW中,我们是以该DB被打开,然后以DB Commit结束. 2.隐式的DB Commit 隐式的DB Commit更没有对应的ABAP语句来告诉系统(