C#定义自定义类型转换

  类型转换不限于单一继承链中的类型(派生类转换为基类或者基类转换为派生类),完全不相关的类型之间也能进行转换。关键在于在两个类型之间提供转型操作符。

下面这样的情况下应该定义显式转型操作符:

  1. 在转型有可能失败时,开发者应该定义显式转型操作符。,例如:从long转换为int,这样可以提醒别人只有在确信转型会成功的时候才执行这样的转型,否则,就准备好在失败的时候捕捉异常。
  2. 执行有损转换的时候,开发者也应该优先使用显式转型。例如:将float转型为int。

    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Project5_42
    {
        class Program
        {
            static void Main(string[] args)
            {
                Sheep sheep = new Sheep();
                Volf volf = new Volf();
                sheep.say();
                sheep = (Sheep)volf;
                sheep.say();
                volf.say();
                volf = sheep;
                volf.say();
            }
        }
        class Sheep
        {
            public void say()
            {
                Console.WriteLine("I am a sheep");
            }
            //使用implicit声明为隐式类型转换
            public static implicit operator Volf(Sheep sheep)
            {
                Console.WriteLine("I turned to a volf from a sheep");
                return new Volf();
            }
        }
        class Volf
        {
            public void say()
            {
                Console.WriteLine("I am a volf");
            }
            //使用explicit声明为显式类型转换
            public static explicit operator Sheep(Volf volf)
            {
                Console.WriteLine("I turned to a sheep from a volf");
                return new Sheep();
            }
        }
    
    }

    
    

    上面的例子演示了为不同类之间转换定义显式和隐式操作符的情况。显示转化使用:explicit声明,在转换时使用括号进行强制类型转换,请求编译器相信程序员的选择,隐式类型转换用:implicit,而隐式类型转换直接可以用赋值表达式。

时间: 2024-08-05 12:37:36

C#定义自定义类型转换的相关文章

在复数类中自定义类型转换函数实现复数和非复数之间的运算

实现复数+double型数据,并且打印运算后实部上的数据 #include <iostream> using namespace std; class Complex { public: Complex( )//定义默认构造函数初始化复数 { real=0; imag=0; } //使用初始化表初始化复数 Complex(double r, double i):real(r),imag(i){} //定义自定义类型转换函数 operator double() { return real; }

Struts2自定义类型转换,和处理类型转换错误

Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自己的转换器: 例: 我有一个Point类型: package cn.jnit.bean; public class Point { private Integer x; private Integer y; public Point() { } public Point(Integer x, Int

不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自定义类型转换 示例CppOperator.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppOperator { public: string Demo(); }; } CppOperator.cpp /* * 运算符重载, 自定义类型转换 */ #include &qu

【.NET深呼吸】基础:自定义类型转换

照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议. 有初入职场的弟弟妹妹们经常诉苦,为啥,因为常常被人骂,被老员工骂,被老板骂.好像自己做的事永远都是错的,于是感觉很受打击,很伤心. 这里老周必须提醒各位,小伙子应该坚强一点,小妹妹们也不要过于绝望,千万不要因为这些事情去做傻事.西湖景观很美,“欲把西湖比西了,淡妆浓抹总相宜”,但是,如果有人跳西

struts2自定义类型转换

struts2 类型转换很智能,他会帮我们自动转换类型,struts会自动转换4类8种原生数据类型和String ,Date,当我们自己定义的类型就不会转换了,需要我们自己去编写类型转换器. 原理:类型转换有两个类,DefaultTypeConverter和Struts2TypeConverter,Struts2TypeConverter继承DefaultTypeConveter,DefaultTypeConverter里面就一个方法convertValue. package com.sheng

AutoMapper搬运工之自定义类型转换

前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NET高级开发,坐标上海,有兴趣的给我留言,或者加我qq:1029183866,加的时候请说明博客园看到. 另外在说说这几天,工作忙是不可避免,业余也在准备自己的网站www.capqueen.com(目前还在备案中),准备用目前会的技术从无到有建立一个CMS(博客),到时候也会发一些文章和大家分享.最近

自定义类型转换

这里说点平常不怎么用的知识(也不建议在项目中运行,因为增加阅读代码成本).自定义类型转换,有两类型:一是类型间隐式转换,一是类型间强制转换. 定义格式: 访问修饰符 static 转换修饰操作符 operator 类型(参数列表); 转换修饰操作符: explicit用于声明必须强制转换的自定义类型转换操作符 implicit用于声明隐式的自定义类型转换操作符 注意隐式转换由系统自行调用,因此不建议再隐式转换中抛出任何异常. 下面看一个简单的小栗子: class MyAge { public i

Spring MVC JSON自定义类型转换(续)

前面提到了两种转换类型的方法(Spring MVC JSON自定义类型转换),这里针对Json转换提供一种更简便的方法. 通过配置全局的日期转换来避免使用麻烦的注解. 首先用到了一个简单的日期工具类DateUtil.java /** * DateUtil类 * * @author liuzh */ public class DateUtil { public static final String Y_M_D = "yyyy-MM-dd"; public static final St

C#简单问题,不简单的原理:不能局部定义自定义类型(不含匿名类型)

今天在进行代码测试时发现,尝试在一个方法中定义一个委托,注意是定义一个委托,而不是声明一个委托变量,在编写的时候没有报错,VS也能智能提示,但在编译时却报语法不完整,缺少方括号,但实际查询并没有缺少,想不通原因,将委托定义移到类中,报错消失,编译成功了. 先看一下报错的源码:(实际上不只委托类型,所有的自定义类型均报错) class Class2 { public void Test() { delegate void testDel(string p); //是错误的 event testDe