Consider a verbatim copy of Bloch's Builder pattern (with changes made for C#'s syntax):
public class NutritionFacts
{
public int ServingSize { get; private set; }
public int Servings { get; private set; }
public int Calories { get; private set; }
...
public class Builder
{
private int ServingSize { get; set; }
private int Servings { get; set; }
private int Calories { get; set; }
public Builder(int servingSize, int servings)
{
ServingSize = servingSize;
Servings = servings;
}
public Builder Calories(int calories)
{ Calories = calories; return this; }
public NutritionFacts Build()
{
return new NutritionFacts(this);
}
}
private NuitritionFacts(Builder builder)
{
ServingSize = builder.ServingSize;
Servings = builder.Servings;
Calories = builder.Calories;
}
}
If you try to run this, the C# compiler will complain that it doesn't have permission to access the private properties of Builder. However, in Java, you can do this. What rule is different in C# that prevents you from accessing private properties of nested classes?
(I realize that people have given alternatives here and that's great. What I'm interested is why you can't use the Java pattern without modification).