麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

17.C#類型判斷和重載決策(九章9.4)

2019-11-17 02:39:05
字體:
來源:轉載
供稿:網友

17.C#類型判斷和重載決策(九章9.4)

  今天來結束第九章,聊下我們經常忽略,但是編譯器會幫我們完成的"類型判斷和重載決策",理解編譯器如何幫我們完成,相信在寫代碼時會更明確,避免一些編譯出錯,排查的問題,讓我們開發更給力。

  我們知道隱式類型的數組以及將方法組轉換為委托類型都需要類型推斷,但將方法組作為其它方法的參數進行轉換時,會顯得極其復雜,我們由淺入深,一步一步來看,編譯器是如何幫我們做的一些推斷。

 1 //定義一個泛型方法,參數分別為TInput類型和一個Func<TInput, TResult>類型的委托 2 public static TResult Get<TInput, TResult>(TInput input, Func<TInput, TResult> func) 3 { 4     return func(input); 5 } 6 static void Main(string[] args) 7 { 8     var a = Get("111", x => int.Parse(x)); 9     //第一個參數是字符串,所以可以推斷TInput類型有到string類型的隱式轉換10     //則方法簽名為:public static TResult Get<string, TResult>(string input, Func<string, TResult> func)11     //第二個參數是一個Lambda表達式,根據返回的類型是一個int,所以可以推斷TResult類型有到int類型的隱式轉換12     //則方法簽名為:public static int Get<string, int>(string input, Func<string, int> func)13     //根據上述的步驟,我們推斷出了TInput和TResult類型14 }

  返回類型集合

  從上述代碼中,可以看到TResult類型是由Lambda表達式的返回值類型來推斷的,那如果我有多個返回類型又是一種什么情況呢?請看下面的代碼。

 1 var b = Get(1111, delegate (int x) { 2     if (x == 1111) 3     { 4         return "1111"; 5     } 6     else 7     { 8         return new object(); 9     }10 });11 //由上可以推斷出TInput類型有到int類型的隱式轉換,則TInput為int12 //而返回類型有兩個,一個是string類型,一個是object類型,但是string類型有到object類型的隱式轉換,則TResult為object類型13 //編譯器幫我們把所有的返回類型放入一個集合,對集合中的類型進行判斷,判斷是否有一個類型是可由剩余其它類型隱式轉換可得,則把這個類型作為返回值的類型

  如何選擇正確的重載

  如果重載具有二義性,那編譯肯定是過不了的,要么強制轉換某個參數以符合某個方法的簽名,或者修改重載方法。從參數或者返回類型考慮,請參照下面一條:

  從任何類型"轉換成它本身"被認為好于"轉換成其它類型",如

1 static void Debug0(int x) { }2 static void Debug0(double x) { }3 4 Debug0(5);      //static void Debug0(int x)5 Debug0(5.0);    //static void Debug0(double x)6 //int有到double的隱式轉換,所以存在二義性,但根據int=>int是好于int=>double的,所以選擇使用static void Debug0(int x)

  同理于返回類型,作用于委托或者Lambda表達式,如

 1 static int Debug1(Func<int> func) { 2     return func(); 3 } 4  5 static double Debug1(Func<double> func) 6 { 7     return func(); 8 } 9 10 Debug1(() => 1.1);11 Debug1(delegate () { return 1.1; });12 //根據Lambda表達式和匿名方法,Debug1(() => 1.1)和Debug1(delegate () { return 1.1; })返回的類型是double類型,則Lambda表達式和匿名方法轉換成Func<double>類型的實例,調用的則是static double Debug1(Func<double> func)13 Debug1(() => 1);14 Debug1(delegate () { return 1; });15 //根據Lambda表達式和匿名方法,Debug1(() => 1)和Debug1(delegate () { return 1; })返回的類型是int類型,則Lambda表達式和匿名方法轉換成Func<int>類型的實例,調用的則是static double Debug1(Func<int> func)

  請斧正。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: av成人免费看 | 羞羞视频一区 | 亚洲国产精品500在线观看 | 精品成人免费视频 | 成人国产在线视频 | 男人的天堂视频网站 | 中国产一级毛片 | 久久国产精品影视 | 久久综合狠狠综合久久 | 久久久www视频 | 五月天堂av91久久久 | 久久久电影电视剧免费看 | 91短视频在线播放 | 国产一区二区精品在线观看 | 成人在线免费视频播放 | 一区二区三区在线观看视频 | 毛片免费观看视频 | 久久99久久99免费视频 | 久久精品美乳 | 久久亚洲激情 | 日本在线观看一区二区 | 欧美一级特黄a | www.54271.com| 久久久精品网 | 欧洲精品久久久 | 久久久久国产成人免费精品免费 | 久夜tv| 国产在线观看 | 性插视频| 亚洲成人国产综合 | 久久久久久久亚洲视频 | 国产精品久久久久久久久久久久久久久 | 538任你躁在线精品视频网站 | 久久av喷吹av高潮av懂色 | 免费男女视频 | 超碰97人人艹 | 日本黄色一级视频 | 欧美视频一区二区 | 久久久久久久久久亚洲精品 | 久久久久久高清 | 久久爽精品区穿丝袜 |