为什么我不能指定从 C# 函数返回的数组的大小?

Why Can't I Specify The Size Of The Array Returned From A C# Function?

我知道以下 C# 代码无法编译:

int[10] TestFixedArrayReturn(int n)
{
   return new int[10]{n, n, n, n, n, n, n, n, n, n};
}
void TestCall()
{
   int[10] result = TestFixedArrayReturn(1);
}

为了使其能够编译,我需要从函数声明(以及结果变量的声明)中删除数组大小,如下所示:

int[] TestFixedArrayReturn(int n)
{
   return new int[10]{n, n, n, n, n, n, n, n, n, n};
}
void TestCall()
{
   int[] result = TestFixedArrayReturn(1);
}

我只是想知道--为什么我不能指定将返回的整数数组的大小?我认为传回的实际上是对数组的引用(无论如何这是我的猜测)但为什么我不能指定要返回的数组的大小?这不会让编译器更仔细地检查我的代码的正确性吗?

编译器如何在编译时知道返回数组的大小?要解决这个问题,它必须执行您方法中的所有代码...

数组就是数组...除非您对其进行初始化,否则它没有大小。当您将一个变量从一个方法传递到另一个方法时,您定义的是 type 而不是它的结构,如数组的大小。

我认为简单的答案是在 .net 中:

  1. 函数 return 个类型的实例
  2. 因此,函数被声明为具有 return 类型
  3. 数组在 .net 中是单一类型 (Class),因此它们可以互操作
  4. 然而,相反,这意味着不同固定大小的数组不是具有不同的类型,只是不同的实例属性。
  5. 这意味着无法将函数定义为特定固定大小的 return 数组,因为数组的长度不是其类型规范的一部分,而是其实例的一部分 settings/attributes。

对于变量,这似乎可以在变量的类型声明中完成,但它实际上是实例初始化规范的一部分,尽管从语法上看它是类型声明的一部分。这可能是出于与 C 等旧语言的风格兼容性原因而保留的,其中在引擎盖下的工作方式大不相同。

然而,对于函数,return 对象 不是 在声明它的地方(在函数声明中)初始化,而是在函数本身的主体中按程序进行初始化.因此,允许在函数声明中设置实例属性可能会导致各种冲突和边缘情况,这些冲突和边缘情况需要由编译器或在 运行-time 进行检查,这两种情况可能都不值得非常小的收益。