c# – 列舉[]是IEnumerable在通用方法中返回true
enum Gender { Male, Female } Gender g = Gender.Male; bool b = g is int; // false, alright no issues b = new[] { g } is IEnumerable<int>; // false, alright no issues b = Is<Gender, int>(g); //false, alright no issues b = Is<Gender[], IEnumerable<int>>(new[] { g }); // true, why on earth !!! static bool Is<S, T>(S s) { return s is T; }
為什麼Gender []是IEnumerable<int>在通用情況下返回true?特別是當它們不相容?
IEnumerable<int> c = new[] { Gender.Male }; //not compilable
在我連結的問題中,我已經絆倒了我!我認為這個問題是相關問題的關鍵.
對於有興趣的人來說,這是陣列的一個角落(不是真的列舉).關注Eric Lippert’s blog 文章在答案中瞭解更多這種邊緣案例.列表<T>不會發生這種情況例如:
b = Is<List<Gender>, IEnumerable<int>>(new List<Gender> { g }); // false, rightly
,解釋了為什麼uint []被CLI處理為int []而不是C#;我懷疑這裡也是同樣的解釋).你甚至不需要泛型來證明:
Gender g = Gender.Male; Console.WriteLine(new[] { g } is IEnumerable<int>); // False Console.WriteLine((object)new[] { g } is IEnumerable<int>); // True
第一個是在編譯時將表示式優化為false,因為C#編譯器“知道”Gender []不是IEnumerable<int>.第二個是表示式生成在執行時評估的isinst指令.引用Eric Lippert:
It is unfortunate that C# and the CLI specifications disagree on this minor point but we are willing to live with the inconsistency.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/20292988/enum-is-ienumerableint-returns-true-in-a-generic-method