我在玩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 possible3.在初始化的同时声明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 method5.使整个情况更加奇怪的是,Span<float>和float*之间没有隐含的转换,反之亦然。
那么stackalloc float[1] 到底返回了什么呢?为什么会引起上述行为的注意?
这段代码是使用VS 2019 C#版本9.0,.NET 5编写的。
发布于 2021-10-23 00:00:47
根据C# 6草案规范 stackalloc
在不安全的上下文中,局部变量声明(局部变量声明)可以包括从调用堆栈分配内存的堆栈分配初始化器。
也就是说,它只能在您称之为“内联”的声明中使用。
根据语言参考,stackalloc没有一个定义的返回类型,但是“在堆栈上分配一个内存块”,然后:
可以将stackalloc表达式的结果分配给以下类型之一的变量:
System.Span<T>或System.ReadOnlySpan<T>开始一些有趣的额外链接:
https://stackoverflow.com/questions/69684033
复制相似问题