迄今为止在C#中被禁止的无参数结构构造函数现在在Visual Studio 14 CTP(编写本文时为CTP 4)中实现,作为实验性功能。
但是,此类无参数构造函数必须是公开的。您不能将它们设为内部或使用任何其他访问修饰符。
在C# Design Notes for Aug 27, 2014中,我找到了解释:
如果C#,VB和F#找到一个,它们都将调用一个可访问的无参数构造函数。如果有一个,但无法访问,C#和VB将回填default(T)
。 (F#会抱怨。)根据您在代码中的位置,成功但不同的新S()行为是有问题的。为了最大限度地减少这个问题,我们应该这样做,以便明确的无参数构造函数必须是公共的。这样,如果你想要替换“默认行为”,你可以在任何地方使用它。
取决于您在代码中的位置"是什么意思,以及如何强制执行public
无参数构造函数来解决问题?
答案 0 :(得分:3)
您可以在以下含义中“在代码中的某个位置”:
struct X
{
//...
public X CreateNew() { return new X(); }
}
new X(); // from the same assembly
new X(); // from another assembly
因此,您所说的机制在每个上下文中对于完全相同的代码片段(new X();
)必须表现不同。在第一个示例中,无论其访问修饰符如何,都可以使用构造函数。在第二个示例中,您可以访问public
或internal
。在第三个问题中,它只能在public
的情况下使用。
使public
简化情况,因为它可以在所有这些环境中访问。
答案 1 :(得分:3)
Where you are in the code
表示根据使用结构的代码的位置,您将获得不同的行为。
例如,如果您有一个标记为internal的无参数构造函数,那么如果您从定义结构的同一程序集或另一个程序集创建实例,则行为会有所不同。
在第一种情况下,调用无参数构造函数,因为它是可访问的,在第二种情况下调用默认值(T)。 private
和protected
构造函数的情况相同。
例如,假设我们有两个程序集,A和B:
//Assembly A
public struct SomeStruct
{
public int x = 0;
internal SomeStruct()
{
x = 10;
}
}
public static void DoSomething()
{
var someStruct = new SomeStruct();
Console.WriteLine(someStruct.x); // prints 10
}
//Assembly B
public static void DoAnotherThing()
{
var someStruct = new SomeStruct();
Console.WriteLine(someStruct.x); // prints 0
}
这会导致行为不一致,具体取决于where you are in the code
以及强制使用public
构造函数的原因。