[英]Why is an instance of indexing a one-dimensional array a BinaryExpression and not a MethodCallExpression?
索引数组(无论维度如何)都是方法调用,因为它涉及调用索引器运算符 。
那么为什么System.Linq.Expressions.Expression.ArrayIndex
方法的重载使得单个数组索引返回BinaryExpression
而other overloads
(表示索引多维数组)会返回MethodCallExpression
?
这只是打破了对称性,迫使我记住这个小异常。 如果他们将其设为MethodCallExpression
,我就不必记住或记下任何事情。
我怀疑是因为这就是IL的样子。 CLI有两种不同的数组: 向量是“秩1,0下限”数组, 数组是“任何等级,任何下限”数组。 (是的,命名很混乱。抱歉。)
向量更有效,因为运行时可以更简单的算术来访问它们。 IL具有处理向量的具体指令,但是一般的数组访问通过一种方法。
为了演示这一点,请编译以下代码:
class Test
{
static void Main()
{
int[] vector = new int[10];
int[,] array = new int[10, 10];
int x = vector[0];
int y = array[0, 0];
}
}
然后用ildasm查看它 - 该方法的最后两行编译为:
// int x = vector[0]
IL_0013: ldloc.0
IL_0014: ldc.i4.0
IL_0015: ldelem.i4
IL_0016: stloc.2
// int y = array[0, 0]
IL_0017: ldloc.1
IL_0018: ldc.i4.0
IL_0019: ldc.i4.0
IL_001a: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_001f: stloc.3
因此表达式树只是将ldelem
指令表示为二元运算符(其中两个操作数是数组和索引),而它使用多维数组的方法调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.