gpt4 book ai didi

c# - 为什么不能将 `stackalloc` 表达式分配给 `Span` 参数?

转载 作者:行者123 更新时间:2023-12-03 22:59:13 25 4
gpt4 key购买 nike

考虑以下方法( fiddle ):

void test(Span<int> param)
{
//Fail, the stackalloc'ed buffer could be exposed.
param = stackalloc int[10];
}

void test2(Span<int> param)
{
//OK
Span<int> local = stackalloc int[10];
}
我不明白为什么 param = stackalloc int[10];产生错误:

A result of a stackalloc expression of type 'Span' cannot be used in this context because it may be exposed outside of the containing method

Spanref struct但是(尽管它的名字)它仍然是一个值类型,所以对 param 的任何修改不会反射(reflect)在调用者对象上。
我想到了 param作为具有初始值的局部变量,我不明白为什么 test2编译时 test没有。 stackalloc int[10]的返回值如何在 test逃离方法的范围?

最佳答案

Sinatr 在评论中发布了一个链接 ( here the relevant part ),帮助我将整个代码放在了 Span safety 的上下文中.
在方法test参数 param返回是安全的,因为我们可以假装它就像一个用调用者给定的值初始化的局部变量(因此,在方法的外部,可以安全地返回)。
当一个局部变量被标记为可以安全返回时,编译器将阻止对其进行任何赋值,这些值不能安全返回( stackalloc 表达式可以安全地转义到方法的顶部范围,但显然不能安全返回) .
该方法是无效的这一事实并不重要(无论是作为提问者的我,还是编译器),因为这条规则是通用的(我认为处理这些极端情况没有太大好处)。
为完整起见,此代码无法编译:

void test2(Span<int> param)
{
//Fail, because local is marked safe to return
Span<int> local = param;
local = stackalloc int[10];
}
这是我正在寻找的缺失部分。

关于c# - 为什么不能将 `stackalloc` 表达式分配给 `Span<T>` 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67299825/

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