Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keyword 'this' (Me) is not available calling the base constructor

Tags:

c#

.net

oop

vb.net

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;
    }
}
like image 566
serhio Avatar asked Feb 28 '23 09:02

serhio


2 Answers

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.

like image 106
Henk Holterman Avatar answered Mar 16 '23 18:03

Henk Holterman


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);
    }
like image 38
Seb Avatar answered Mar 16 '23 17:03

Seb