17.C#类型判断和重载决策(九章9.4)
生活随笔
收集整理的這篇文章主要介紹了
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 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)請斧正。
?
轉載于:https://www.cnblogs.com/a2htray/p/4214323.html
總結
以上是生活随笔為你收集整理的17.C#类型判断和重载决策(九章9.4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Clojure语法学习-循环
- 下一篇: 我的前端之路启程了