为什么无参数结构构造函数必须在C#6中公开?

时间:2014-11-01 19:10:15

标签: c# struct

迄今为止在C#中被禁止的无参数结构构造函数现在在Visual Studio 14 CTP(编写本文时为CTP 4)中实现,作为实验性功能。

但是,此类无参数构造函数必须是公开的。您不能将它们设为内部或使用任何其他访问修饰符。

C# Design Notes for Aug 27, 2014中,我找到了解释:

  如果C#,VB和F#找到一个,它们都将调用一个可访问的无参数构造函数。如果有一个,但无法访问,C#和VB将回填default(T)。 (F#会抱怨。)

     

根据您在代码中的位置,成功但不同的新S()行为是有问题的。为了最大限度地减少这个问题,我们应该这样做,以便明确的无参数构造函数必须是公共的。这样,如果你想要替换“默认行为”,你可以在任何地方使用它。

取决于您在代码中的位置"是什么意思,以及如何强制执行public无参数构造函数来解决问题?

2 个答案:

答案 0 :(得分:3)

您可以在以下含义中“在代码中的某个位置”:

  • 在你的结构的上下文中,即:

struct X
{
    //...

    public X CreateNew() { return new X(); }
}
  • 在您的装配环境中:

new X();  // from the same assembly
  • 在另一个集会中

new X(); // from another assembly

因此,您所说的机制在每个上下文中对于完全相同的代码片段(new X();)必须表现不同。在第一个示例中,无论其访问修饰符如何,都可以使用构造函数。在第二个示例中,您可以访问publicinternal。在第三个问题中,它只能在public的情况下使用。

使public简化情况,因为它可以在所有这些环境中访问。

答案 1 :(得分:3)

Where you are in the code表示根据使用结构的代码的位置,您将获得不同的行为。

例如,如果您有一个标记为internal的无参数构造函数,那么如果您从定义结构的同一程序集或另一个程序集创建实例,则行为会有所不同。

在第一种情况下,调用无参数构造函数,因为它是可访问的,在第二种情况下调用默认值(T)。 privateprotected构造函数的情况相同。

例如,假设我们有两个程序集,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构造函数的原因。