'private set' in auto-implemented Properties would not work

  • Thread starter Thread starter hee-chul
  • Start date Start date
H

hee-chul

The below code can be compiled ant executed even though the Main
static method uses the 'private set' Property, CustomerId.
Is It Bug?
I'm using VS2008, .Net Framework 3.5.
Of course, If I moved the Main method into another file, then
compilation error is shown like this,
"The property of indexer "XTest.Program.CustomerId" cannot be used in
this context because the set accessor is inaccessible.

namespace XTest
{
public class Program
{

/// <summary>
/// Customer Id
/// </summary>
public int CustomerId { get; private set; }

/// <summary>
/// Default Constructor
/// </summary>
public Program()
{
CustomerId = 3;
}

/// <summary>
/// Dummy Method
/// </summary>
/// <returns>the magic #</returns>
public int GetMagicNumber()
{
return CustomerId * 10;
}

/// <summary>
/// External Main Method
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Program _x = new Program();
_x.CustomerId = 10;

Console.WriteLine("Cusomter : " + _x.CustomerId);
Console.WriteLine("MAGIC ## : " + _x.GetMagicNumber());

_x.CustomerId = 5; // Why does this expression work?
Console.WriteLine("Cusomter : " + _x.CustomerId);
Console.WriteLine("MAGIC ## : " + _x.GetMagicNumber());

}
}
}
 
hee-chul said:
The below code can be compiled ant executed even though the Main
static method uses the 'private set' Property, CustomerId.
Is It Bug?
I'm using VS2008, .Net Framework 3.5.
Of course, If I moved the Main method into another file, then
compilation error is shown like this,
"The property of indexer "XTest.Program.CustomerId" cannot be used in
this context because the set accessor is inaccessible.

namespace XTest
{
public class Program
{

/// <summary>
/// Customer Id
/// </summary>
public int CustomerId { get; private set; }

/// <summary>
/// Default Constructor
/// </summary>
public Program()
{
CustomerId = 3;
}

/// <summary>
/// Dummy Method
/// </summary>
/// <returns>the magic #</returns>
public int GetMagicNumber()
{
return CustomerId * 10;
}

/// <summary>
/// External Main Method
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Program _x = new Program();
_x.CustomerId = 10;

Console.WriteLine("Cusomter : " + _x.CustomerId);
Console.WriteLine("MAGIC ## : " + _x.GetMagicNumber());

_x.CustomerId = 5; // Why does this expression work?
Console.WriteLine("Cusomter : " + _x.CustomerId);
Console.WriteLine("MAGIC ## : " + _x.GetMagicNumber());

}
}
}
.

That is the way that a private setter should work, auto-implemented or
otherwise. The property is part of the program class as is the main method,
so main has access to the set method.

When you move the property to another class, then of course, the set method
is not accessable.

Mike
 
Back
Top