随便写写

首先,假设我们有一个Person类型

其类型定义如下

  class Person
{
public string Name { get; set; } = "Person";
public int Age { get; set; } = ; public Person() { } public Person(string name,int age)
{
this.Name = name;
this.Age = age;
} public Person(string name) : this(name, ) { }
public Person(int age) : this("Person", age) { } }

在正常情况下,我们让两个Person类型相加,是不可能的,例如:

那么如何能让两个Person类型相加,然后返回一个Person类型呢

例如,我想让名字为"张三"年龄为19的Person加上另一个名字为"李四",年龄为20的Person

然后返回一个名字为"张三李四",年龄为39的Person

那么就需要用到重载"+"号这个操作符了

所以,代码就如下,在Person中重载

     /// <summary>
/// 重载+号
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <returns>返回一个Person类型</returns>
public static Person operator+(Person p1,Person p2)
{
//将两个相加的Person类型分别让他们的
//名字和年龄相加后的值赋值给被返回的Person类型
Person p3 = new Person(p1.Name + p2.Name, p1.Age + p2.Age);
return p3;
}

然后我们就可以在Main中来相加两个Person类型了

看图

这样就成功了

然后其它的诸如

而关键点就在于如果你要重载操作符就必须格式如下

白话:public static 返回类型 operator被重载的操作符(本类型,要与之操作的类型)

正文:public static Person operator+(Person p1,Person p2)   => 意思为:我要让两个Person类型相加,然后返回一个Person类型

甚至你可以把返回类型改为int,然后两个Person类型相加后,你返回一个int类型的数据回去

例如返回  p1.Age+p2.Age  这样,在将两个Person类型相加之后,将得到一个int类型的数据,其值就是相加的两个Person类型的Age值的相加值

还有个要注意的是,

如果你重载了 == 操作符,就必须要重载 != 因为它们是成对,还有其它成对运算符

而且重载了 == 后,还应该重载 Equals,以及GetHashCode

===========================================================================================================

下面再说说转换操作符

还是说上面的那个Person吧

例如,我非要让

Person p=30;

正常情况下,是不可能的,但如果我这样在Person中写就行了

 public static implicit operator Person(int age)
{
return new Person(age);
}

格式的话,就是固定死的,implicit关键字,如果没记错的话就是代表可以隐式转换

还有个显示转换的,我忘了,不好意思,懒得查资料了

这一段代码的意思就是

我要让一个Person类型的数据,能够给它一个int类型的值

例如

=============================================================================================

后记:写得比较少,只拣了两个例子去随便说了下,其实自己感觉就这两个例子就够了

其它的自己多尝试,语法格式都是固定死了的,怎么写就看自己的思想有多么天马行空了

好了,最后我们来利用刚才说的东西,去解决一下下面这道题

怎么让

a==1 && a==2 && a==3 =true

怎么做呢,看我们来调皮一下吧

首先,我们不管a是什么类型,反正不太可能是int类型,因为不管原始a等于多少,上述表达式似乎都不为true

那么我们自己来建个类型为Rational

我们要做的就一件事

为Rational重载 == 操作符

让它不管与什么int类型的数字比较都返回true  (够调皮吧)

看代码吧:

class Rational
{
public int Val { get; set; } = ; public Rational()
{ } public Rational(int val)
{
this.Val = val;
} /// <summary>
/// 我们重载了==操作符
/// </summary>
/// <param name="r"></param>
/// <param name="val"></param>
/// <returns></returns>
public static bool operator==(Rational r,int val)
{
//只返回一个true是为了让所有与Rational类型相比对的int类型
//都返回true
//因为重载了==,所以必须重载!=
//其实还应该重载Equals,以及GetHashCode
//因为它们都是判断相等的类型 return true;
} public static bool operator !=(Rational r, int val)
{
return true;
} }

然后在Main中试试吧

 static void Main(string[] args)
{
Rational a = new Rational();
bool result = a == && a == && a == ;
Console.WriteLine(result);
Console.ReadKey();
}

你会发现,为true,是吧

C#关于操作符重载与转换的更多相关文章

  1. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  2. C#中如何利用操作符重载和转换操作符 (转载)

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  3. (二) operator、explicit与implicit 操作符重载

      有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整 ...

  4. 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数

    ++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...

  5. C++ operator overload -- 操作符重载

    C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ...

  6. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

  7. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换

    C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...

  8. Python中的操作符重载

    运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果.     类可以重载python的操作符 操作符重载使我们的对 ...

  9. Python操作符重载总结&列表模型

    操作符重载 二元运算符 特殊方法 + __add__,__radd__ - __sub__,__rsub__ * __mul__,__rmul__ / __div__,__rdiv__,__trued ...

随机推荐

  1. Win(Phone)10开发第(3)弹,简单的Demo程序网络请求json解析列表显示

    先分享一个由Json字符串直接生成解析对应的类的工具: jsonclassgenerator14 百度天气接口 下面是由一个小功能(又特么的是天气)的实现,记录下下UAP的流程和结构(其实跟之前一模一 ...

  2. DevExpress WinForms Controls 学习系列1

    一个偶然的机会,接触到DevExpress.项目是WinForm的,应用了DevExpress.为了使项目具备维护开发的生命力,我觉得有必要系统的学习一下DevExpress,今天是学习笔记的第一篇. ...

  3. max渲染通道元素的范例

    renderElementManager = MaxOps.GetCurRenderElementMgr() renderElementManager.Removeallrenderelements( ...

  4. 基于JMS的ActiveMQ搭建与实现

    1.JMS Java消息服务(Java Message Service)即JMS,是一个Java平台中关于面向消息中间件的API,用于两个程序之间,或分布式系统中发送消息,进行异步通信. JMS包括队 ...

  5. 日常一些出现bug的问题

    1.Fatal signal 4 (SIGILL), code 1, fault addr 0xca31569e in tid 8033 (r.myapplication) fault addr : ...

  6. 面向对象进阶-item系列、__new__、__hash__、__eq__ (四)

    item系列 dic = {'k':'v'}# 对象 : 存储属性 和调用方法dic['k'] = 'v'# class Foo:#     def __init__(self,name,age,se ...

  7. hdoj1072 Nightmare(bfs)

    题目大意: 在迷宫中有一个炸弹,过六个单位时间就会爆炸,要你求一个起点到迷宫的终点的最短距离,迷宫中有时间重置器,当你走到这个格子,炸弹的爆炸时间重新置为0,迷宫中标识为墙壁的格子不能走,到达任意一个 ...

  8. HDU 6205(尺取法)2017 ACM/ICPC Asia Regional Shenyang Online

    题目链接 emmmm...思路是群里群巨聊天讲这题是用尺取法.....emmm然后就没难度了,不过时间上3000多,有点.....盗了个低配本的读入挂发现就降到2800左右, 翻了下,发现神犇Clar ...

  9. 比特、字节、K

    比特(bit) 比特,计算机专业术语,是信息量单位,由英文BIT音译而来.BIT为Binary digit(二进制数)位的缩写.二进制数的一位所包含的信息就是一比特,如二进制数0100就是4比特. 字 ...

  10. Windows下TensorFlow安装指南(图文版)

    随着深度学习概念火起来,TensorFlow也跟着成为业界流行的深度学习框架.它采用CPU+GPU的并行计算模式,使得神经网络可以有效的并行计算,从以前的三层网络到现在的深层网络,深度学习+tenso ...