gpt4 book ai didi

c# - stackalloc 表达式的返回类型是什么?

转载 作者:行者123 更新时间:2023-12-05 05:54:15 26 4
gpt4 key购买 nike

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

1. 隐式输入返回 float* :

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

2.声明一个float*稍后使用 stackalloc 进行设置不编译:

    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> 之间没有隐式转换。和 float*反之亦然。

那么stackalloc float[1]到底是什么?返回?为什么会出现上述行为?

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

最佳答案

根据 C# 6 draft specification stackalloc :

In an unsafe context, a local variable declaration (Local variable declarations) may include a stack allocation initializer which allocates memory from the call stack.

即它只能用于您称为“内联”的声明。

根据 language reference stackalloc没有单一定义的返回类型,而是“在堆栈上分配一 block 内存”,然后:

You can assign the result of a stackalloc expression to a variable of one of the following types:

  • Beginning with C# 7.2, System.Span<T> or System.ReadOnlySpan<T>
  • A pointer type

一些有趣的额外链接:

关于c# - stackalloc 表达式的返回类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69684033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com