In the inherited class I use the base constructor, but I can't use the class's members calling this base constructor.
In this example I have a PicturedLabel that knows its own color and has an image. A TypedLabel : PictureLabel
knows its type but uses the base color.
The (base) image that uses TypedLabel should be colored with the (base)color, however, I can't obtain this color
Error: Keyword 'this' is not available in the current context`
A workaround?
/// base class
public class PicturedLabel : Label
{
PictureBox pb = new PictureBox();
public Color LabelColor;
public PicturedLabel()
{
// initialised here in a specific way
LabelColor = Color.Red;
}
public PicturedLabel(Image img)
: base()
{
pb.Image = img;
this.Controls.Add(pb);
}
}
public enum LabelType { A, B }
/// derived class
public class TypedLabel : PicturedLabel
{
public TypedLabel(LabelType type)
: base(GetImageFromType(type, this.LabelColor))
//Error: Keyword 'this' is not available in the current context
{
}
public static Image GetImageFromType(LabelType type, Color c)
{
Image result = new Bitmap(10, 10);
Rectangle rec = new Rectangle(0, 0, 10, 10);
Pen pen = new Pen(c);
Graphics g = Graphics.FromImage(result);
switch (type) {
case LabelType.A: g.DrawRectangle(pen, rec); break;
case LabelType.B: g.DrawEllipse(pen, rec); break;
}
return result;
}
}
This error does make a lot of sense.
If you were allowed to use this
in that way there would be a timing problem. What value do you expect LabelColor to have (ie, when is it initialized)? The constructor for TypedLabel hasn't run yet.
You are trying to access to a member that isn't initialized yet. this.LabelColor calls to the base class member that isn't available : you haven't called the base class constructor yet when you write : base(...)
public TypedLabel(LabelType type)
: base()
{
pb.Image = GetImageFromType(type, this.LabelColor);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With