我正在读Jon Skeet的书“C#in Depth,2nd Edition”。他说我们可以使用两个变通方法调用带有动态参数的扩展方法,就像
一样dynamic size = 5;
var numbers = Enumerable.Range(10, 10);
var error = numbers.Take(size);
var workaround1 = numbers.Take((int) size);
var workaround2 = Enumerable.Take(numbers, size);
然后他说“如果你想用动态值作为隐式this
值调用扩展方法,两种方法都会有效”。我不知道如何实现它。
非常感谢。
答案 0 :(得分:40)
像这样:
dynamic numbers = Enumerable.Range(10, 10);
var firstFive = Enumerable.Take(numbers, 5);
换句话说,只需将其称为静态方法而不是扩展方法。
或 if 如果你知道一个合适的类型参数你可以把它投出来,我通常会用一个额外的变量来做:
dynamic numbers = Enumerable.Range(10, 10);
var sequence = (IEnumerable<int>) numbers;
var firstFive = sequence.Take(5);
...但是如果你正在处理动态类型,你可能不知道序列元素类型,在这种情况下,第一个版本让“执行时编译器”基本上解决它。
答案 1 :(得分:3)
扩展方法只是一个语法糖,它将被转换为c#编译器调用的普通方法。此转换依赖于当前语法上下文(使用语句导入哪些名称空间)。
动态变量是运行时的过程。这次,CLR无法获得足够的语法上下文信息来决定使用哪种扩展方法。所以,它不起作用。