In the line
colour = theColour;
the compiler can't tell what you mean. It could be either
private string colour;
or it could be
public string colour { get; set }
To disambiguate choosing a different naming convention helps. For example you could choose that properties have an uppercase first letter and fields start with an underscore and a lower case letter. In that case your class would look as follows:
class Dog
{
private int _weight;
private string _colour;
public string Colour { get; set; }
public Dog(int theWeight, string theColour)
{
_weight = theWeight;
_colour = theColour;
}
}
Note, though, that you probably have a duplication here anyways. Chances are that it wasn't your intention to have both the automatic property Colour and the field _colour in the first place.
You can also choose a tool to help you follow recommended guidelines. As an example have a look at FxCop. There is not right or wrong but it is certainly easier to work with rules that are generally accepted. (Admittedly my suggestion to use underscores for fields is not in line with what is generally accepted. However, I don't use public fields.)