【发布时间】:2018-09-14 03:24:38
【问题描述】:
我注意到即使局部变量未初始化,以下内容也会编译和执行。这是 Span 的一个特性吗?
void Uninitialized()
{
Span<char> s1;
var l1 = s1.Length;
Span<char> s2;
UninitializedOut(out s2);
var l2 = s2.Length;
}
void UninitializedOut(out Span<char> s)
{}
【问题讨论】:
-
对我来说似乎是一个错误,但据我所知,
out无论如何都不是由 CLR 强制执行的。 -
Span并不特殊;您自己的struct Foo { public int Length => 0; }也会触发此错误(或“次优处理”)。 -
@JeroenMostert 不过,不是一个错误;
Foo确实没有字段,所以就明确赋值而言:没问题 -
@MarcGravell:是的——也不是。这是一件坏事:添加私有字段会破坏毫无戒心的代码,并且客户端无法控制的那种脆弱性是不可取的。允许这样做是用编译器有色眼镜看东西。它应该抱怨并强制
new Foo()(当然,仍然编译成同样的东西),即使你可以按照规则解释为什么它不会。 -
@JeroenMostert 将公共或私有字段添加到结构将做到这一点 today;向结构添加字段不是安全的更改。考虑:
Position pos; pos.X = 12; pos.Y = 42; Draw(pos);。这是用公共字段初始化可变结构的一种完全合法的方法(我现在将忽略带有公共字段的可变结构是否是它们自己好主意的问题.. .)。现在添加Z,您现有的代码将停止编译。
标签: c# c#-7.2 system.memory