前言
有時候不得不感嘆中國的文化確實是博大精深,你稍有不慎就會誤入歧途,到最終迷茫過后,回過頭來再看,哦 ,原來是這個意思,所以說每一字每一句都得仔細斟酌,為什么要這樣說,請看我以為的!
話題
在控制台中寫一個方法如下
1 static int OptionParam(int a = 0, int b, int c) 2 { 3 return a + b + c; 4 }
然后再控制台調用方法 Console.WriteLine(OptionParam(0, 1, 2)); 進行輸入,很顯然會告訴你錯誤:可選參數必須出現在所有必需的參數之后 ,那么進行修改如下
1 static int OptionParam(int b, int c, int a = 0) 2 { 3 return b + c + a; 4 }
然后再調用方法 Console.WriteLine(OptionParam(0, 1)); 明顯會輸出1,你以為這樣這樣就可以完了嗎,你難道就不會多想一點,你這是可選參數(option parameter),如果我有個未知參數params(unknown params)兩個結合會怎樣呢??接下來代碼修改如下:
1 static void OptionParam(int b, int c = 0, params int[] a) 2 { 3 Console.WriteLine(a.Length); 4 }
因為在該方法中c有默認值,而且我們知道我們在調用參數可以顯示按照我們的意願來調用參數,所以下面我們這樣調用 OptionParam(0, a: 1, 2); 理論上是可以的,對嗎,我也這樣認為,結果卻是
拋開這句話,你是不是心生疑惑可選參數和params是不是在一起就是個錯誤呢?這句話我想了想應該是里面傳了三個參數進去,編譯器認為你也指定了參數b即使你顯示指定了參數a,所以不會通過!既然這樣,a參數傳一個是不是就對了呢,試試 OptionParam(0, a: 1); 果不其然,沒有任何錯誤,運行正確!那么問題來了,我既然用的是params參數數組,肯定就是不確定我要傳的參數的個數啊,現在你居然完全限制只能讓我傳一個參數進去,你鬧呢,接着想辦法,利用方法重載試試看看!代碼如下:
1 static void OptionParam(int b, params int[] a) 2 { 3 Console.WriteLine(a.Length); 4 } 5 6 static void OptionParam(int b, int c = 0, params int[] a) 7 { 8 Console.WriteLine(a.Length); 9 }
然后再調用方法 OptionParam(0,1,3,4,4); 這樣就巧妙的解決了問題,但是問題又來了,這樣的話 可選參數和params就不能在一起使用 !這樣就形成了一個惡性循環即 連在一起使用,params參數個數受限制!通過重載,兩者又不能連在一起使用 ,當然我們回到問題的源頭,現在是不是覺得題目標題是正確的,誰說 可選參數必須位於所有參數最后 ,上面情況不是明確驗證了這點了嗎!解決了這點,出現了新的問題,那我們繼續解決,這不就是我們碼農的精神,哈哈!不要灰心,難道真的不能再一起好好的玩耍嗎,看看下面代碼。
1 static void OptionParam(int b = 0, params int[] c) 2 { 3 Console.WriteLine(c.Length); 4 }
同樣調用上述方法 OptionParam(0, 1, 3, 4, 4); 結果運行完全正確,上述那是因為在可選參數之前還有必須參數,導致無法直接結合在一起使用!所以問題總歸還是有解決的辦法的,事在人為!
反省
歸根結底,可選參數必須位於所有參數最后,這話確確實實是錯的,但是是自己欺騙了自己,出現錯誤時,編譯器表述為:可選參數必須出現在所有必需的參數之后!是我解釋為上述標題,通過了本文你就明確知道為什么要加必須的三個字,恰好就是為了可選參數和params非必須參數的完美邂逅擦出的火花,因此從中也能總結出一點人生道理:有些在你看來完全不起眼的地方,當你放眼長遠,也許正是這些不起眼,才造就了更好的自己!
總結
【1】可選參數必須出現在所有必需的參數之后
【2】params參數必須出現在所有參數之后