只需尝试使用C#Lookup集合的一些基础知识,就会发现,这个简单的示例可以很好地编译,即使IGrouping接口也应将TElement设置为int。
string txt = "Hello world!";
ILookup<char, int> occurrences = Enumerable.Range(0, txt.Length).ToLookup(i => txt[i], i => i);
foreach (IGrouping<char, string> values in occurrences)
Console.WriteLine($"{values.Key}: {string.Join(", ", values)}");
显然,我在无效类型转换时遇到运行时错误。但是我希望这对编译器有用...
似乎这是编译器使用的规则:
如果编译器发现值类型或密封类未实现或继承程序员尝试转换为的类型或从其继承的类型,则该转换在编译时是非法的。
(感谢捷普·斯蒂格·尼尔森(Jeppe Stig Nielsen)在评论中提到了这一点。)
foreach (XXXX values in occurrences)
如果您使用以下任一选项而不是XXXX
示例,则这是编译的结果。注意occurrences
是ILookup<char, int>
从派生的类型IGrouping<char, int>
。
public class MyClass { }
编译方式public sealed class MyClass { }
编译时错误public sealed class MyClass : IGrouping<char, int> {...}
编译方式public sealed class MyClass : IGrouping<char, string> {...}
编译时错误public struct MyStruct {}
编译时错误public struct MyStruct : IGrouping<char, string> {...}
编译时错误public struct MyStruct : IGrouping<char, int> {...}
编译方式这是Krzysztof Cwalina撰写的一篇不错的博客文章,描述了Duck键入在foreach中的使用方式:
C#的foreach运算符已使用鸭子类型。这对于某些人来说可能是令人惊讶的,但是要在C#中支持foreach,则无需实现IEnumerable
!您要做的就是:
提供一个GetEnumerator
不带任何参数并返回具有两个成员的类型的公共方法:a)MoveMext
不带参数并返回一个布尔值的方法,以及b)一个Current
具有getter的属性,该方法返回一个Object。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句