operator、explicit与implicit
說這個之前先說下什么叫隱式轉(zhuǎn)換和顯示轉(zhuǎn)換
1、所謂隱式轉(zhuǎn)換,就是系統(tǒng)默認(rèn)的轉(zhuǎn)換,其本質(zhì)是小存儲容量數(shù)據(jù)類型自動轉(zhuǎn)換為大存儲容量數(shù)據(jù)類型。
例如:float f = 1.0; double d=f;這樣就是把float類型的f隱式轉(zhuǎn)換成double類型了!但其實系統(tǒng)幫我們做了類似如下的工作:
float f = 1.0; double d=(double)f;
對于表示數(shù)值的基本數(shù)據(jù)類型來說,數(shù)值范圍小的數(shù)據(jù)類型轉(zhuǎn)換成數(shù)值范圍大的數(shù)據(jù)類型可以進(jìn)行隱式轉(zhuǎn)換,而反過來則必須進(jìn)行顯示轉(zhuǎn)換
2、顯式類型轉(zhuǎn)換,即強制類型轉(zhuǎn)換。與隱式轉(zhuǎn)換相反,而且強制轉(zhuǎn)換會造成數(shù)據(jù)丟失。
例如:double d = 1.456; float f=(float)d;
只要強制指出轉(zhuǎn)換成什么類型,就表示是顯示轉(zhuǎn)換
class Person:Animal{}
Person p=(Person)Animal; //顯示轉(zhuǎn)換
Animal a=p; //隱式轉(zhuǎn)換
對于類類型來說,子類轉(zhuǎn)換成父類可以進(jìn)行隱式轉(zhuǎn)換,而反過來則必須進(jìn)行顯式轉(zhuǎn)換,如果兩個類之間沒有繼承關(guān)系,則不能進(jìn)行隱式轉(zhuǎn)換或顯式轉(zhuǎn)換,此時必須在被轉(zhuǎn)換的類中定義一個隱式轉(zhuǎn)換(implicit)方法或顯式轉(zhuǎn)換(explicit)方法。
基本上是沒有轉(zhuǎn)換表達(dá)式的轉(zhuǎn)換都是隱式轉(zhuǎn)換,比如double a = 1 ;
而int類型顯示轉(zhuǎn)換成double顯示轉(zhuǎn)換就帶有顯示的(double)轉(zhuǎn)換類型doubl a=(double)1;
隱式轉(zhuǎn)換、顯式轉(zhuǎn)換是由對象兼容性而來的。兼容性包含兩個方面,一個是它們之間具有繼承或?qū)崿F(xiàn)接口的關(guān)系。比如A繼承自B,那么B有的東西A肯定有;A實現(xiàn)了B接口,那B規(guī)定的東西A肯定都有。這時候,A都可以隱式轉(zhuǎn)換為B,因為B有的A肯定都有,這是必然的。如果一個對象類型為B,那么則不可以隱式轉(zhuǎn)換為A,因為A有的東西B不一定有;但如果你知道這個類型為B的東西一定是A,那么就可以用顯式轉(zhuǎn)來來轉(zhuǎn)換對象類型。另一種轉(zhuǎn)換則是由對象規(guī)定的運算符,對象可以規(guī)定自己的顯式或隱式運算符,將自己同另外一種對象間相互轉(zhuǎn)換,這是通過運算符重載實現(xiàn)的(也就是接下來要講的explicit(顯示轉(zhuǎn)換)和implicit(隱式轉(zhuǎn)換),不怎么常用)。而Parse方法則是對象自帶的方法,你可以看作是和上面的運算符顯式轉(zhuǎn)換相同作用的,不過它是通過定義一個靜態(tài)方法來實現(xiàn)轉(zhuǎn)換。Convert也是這個用處,但是它做的工作比Parse方法一般要多,因此兼容性更好,但是速度也就會稍慢一些。
?
operator、explicit與implicit
operator?關(guān)鍵字用來重載內(nèi)置運算符
class Program{static void Main(string[] args){Person p1 = new Person() { Age = 3 };Person p2 = new Person() { Age = 3 };Console.WriteLine(p1 == p2); //輸出Trueint i = p1;Console.WriteLine(i); //輸出3 Person p3 = (Person)4;Console.WriteLine(p3.Age); //輸出4 Person p4 = p1 + p2;Console.WriteLine(p4.Age);//輸出6 Console.ReadKey();}}public class Person{public int Age { get; set; }public static bool operator ==(Person p1, Person p2){return p1.Age == p2.Age;}public static bool operator !=(Person p1, Person p2){return p1.Age != p2.Age;}public static Person operator +(Person p1, Person p2){return new Person() { Age = p1.Age + p2.Age };}/** 作用:是把Person類型隱式轉(zhuǎn)換成int類型* 使用顯示轉(zhuǎn)換也是可以的 */public static implicit operator int(Person p){return p.Age;}/** 作用:是把int類型顯式轉(zhuǎn)換成Person類型* 使用隱示轉(zhuǎn)換則會報錯,指定顯示轉(zhuǎn)換則必須用顯示轉(zhuǎn)換,不可以用隱式轉(zhuǎn)換*/public static explicit operator Person(int i){return new Person() { Age = i };}}?
轉(zhuǎn)載于:https://www.cnblogs.com/MrZivChu/p/operator.html
總結(jié)
以上是生活随笔為你收集整理的operator、explicit与implicit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。