2

我正在玩stackalloc并发现它的返回类型有很多奇怪之处。以下是一些使用示例stackalloc<float>

1.隐式输入返回float*

var a = stackalloc float[1];//a is float*

2.声明 afloat*并稍后设置它 usingstackalloc不会编译:

    float* a;
    a = stackalloc float[1];//CS8346 conversion of a stackallock expression of type 'float' to type 'float*' is not possible

3.float*在初始化的同时声明就可以了:

float* a = stackalloc float[1];

4.类似的行为发生在Span<float>

这工作得很好:

 Span<float> a = stackalloc float[1];

但这不会编译:

        Span<float> a; 
        a = stackalloc float[1];//CS8353 A result of a stackalloc expression of type 'Span<float>' cannot be used in this context because it may be exposed outside of the containing method

5.Span<float>使整个情况更加奇怪的是, and or之间没有隐式转换,float*反之亦然。

那么返回的究竟是什么stackalloc float[1]?为什么会出现上述行为?

此代码是使用 VS 2019 C# 版本 9.0、.NET 5 编写的。

4

1 回答 1

1

根据C# 6 草案规范 stackalloc

在不安全的上下文中,局部变量声明(局部变量声明)可能包括一个堆栈分配初始化程序,它从调用堆栈分配内存。

即它只能用在你称之为“内联”的声明中。

根据语言参考 stackalloc没有单一定义的返回类型,而是“在堆栈上分配一块内存”,然后:

您可以将 stackalloc 表达式的结果分配给以下类型之一的变量:

  • 从 C# 7.2 开始,System.Span<T>System.ReadOnlySpan<T>
  • 指针类型

一些有趣的额外链接:

于 2021-10-23T00:00:47.573 回答