I have the following code:
public class Parent
{
public string MyField { get; set; }
}
public class Child : Parent
{
protected new int MyField { get; set; }
}
I try and access this with:
static void Main(string[] args)
{
Child child = new Child();
child.MyField = "something";
}
Visual studio 2008 compiles this without comment, but under Mono (2.4.2, Ubuntu) I get the error message
'HideTest.Child.MyField' is inaccessible due to its protection level (CS0122)
Is one implementation or the other more compliant with the standard here?
Edit: Thanks to all the people who have pointed out the bad design. Unfortunately it’s a third-party library and changing it significantly isn’t practical.
From ECMA-334 (the C# spec) §10.7.1.2 :
You can see this behavior by running this test on Microsoft’s implementation.
Which will output:
So the property you’re accessing from your
Main()should be the base class property (as it is in MS.NET), not the derived property (as in Mono), because the new derived member only hides the ‘old’ base member in protected scope.Mono is doing something wrong here according to the spec.