【发布时间】:2018-05-13 17:57:19
【问题描述】:
- 如果结构没有字段,则无需初始化即可访问它。
- 如果当前项目中的结构有字段,则会收到错误“Use of unassigned local variable”。
- 如果不同项目中的结构具有字段,则无需初始化即可访问它。
这种行为似乎奇怪地不一致。使用不同项目中的字段访问未初始化的结构不会导致错误的原因是什么,但如果它是在同一个项目中声明的呢?语言规范是否解决了这个问题?
这里有一些示例代码演示了各种场景。
项目 1
static void Main()
{
A a;
a.ToString(); // No problem
B<int> b;
b.ToString(); // Use of unassigned local variable 'b'
C<int> c;
c.ToString(); // No problem
}
public struct A
{
}
public struct B<T>
{
T[] a;
}
项目 2
public struct C<T>
{
T[] a;
}
(使用VS2017 15.4.5)
【问题讨论】:
-
我不知道规范中有没有提到它,但this 是一些有趣的读物。基本上我们倾向于将私有字段视为实现而不是接口,但 C# 中明确赋值的规则要求将结构的私有字段视为其接口的一部分。
-
在某种程度上肯定相关。但是参考程序集和我的示例之间的区别在于
Project 2不是参考程序集。这是一个适当的程序集,从技术上讲,所有这些私有字段都以某种方式在程序集中(即反射会返回它们) -
是的,这是不同的。这个github issue answers。这似乎是为了向后兼容旧版本的编译器。
-
@mikez 这是一个很棒的链接。使用
<Features>strict</Features>标志实际上解决了我的根本问题。如果您将其作为答案发布(可能直接包含该标志),请立即接受。
标签: c# struct initialization