C# "must declare a body because it is not marked abstract, extern, or partial"
I'm not sure why i'm getting this error to be honest.
private int hour
{
get;
set
{
//make sure hour is positive
if (value < MIN_HOUR)
{
hour = 0;
MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(),
"Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
//take the modulus to ensure always less than 24 hours
//works even if the value is already within r开发者_如何学运维ange, or value equal to 24
hour = value % MAX_HOUR;
}
}
}
I've also tried just doing an actual property:
public int hour
{
get;
set
{
//make sure hour is positive
if (value < MIN_HOUR)
{
hour = 0;
MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(),
"Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
//take the modulus to ensure always less than 24 hours
//works even if the value is already within range, or value equal to 24
hour = value % MAX_HOUR;
}
}
}
Suggestions?
Try this:
private int hour;
public int Hour
{
get { return hour; }
set
{
//make sure hour is positive
if (value < MIN_HOUR)
{
hour = 0;
MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(),
"Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
//take the modulus to ensure always less than 24 hours
//works even if the value is already within range, or value equal to 24
hour = value % MAX_HOUR;
}
}
}
You need to provide a body for the get;
portion as well as the set;
portion of the property.
I suspect you want this to be:
private int _hour; // backing field
private int Hour
{
get { return _hour; }
set
{
//make sure hour is positive
if (value < MIN_HOUR)
{
_hour = 0;
MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(),
"Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
//take the modulus to ensure always less than 24 hours
//works even if the value is already within range, or value equal to 24
_hour = value % MAX_HOUR;
}
}
}
That being said, I'd also consider making this code simpler. It's probably is better to use exceptions rather than a MessageBox inside of your property setter for invalid input, as it won't tie you to a specific UI framework.
If that is inappropriate, I would recommend converting this to a method instead of using a property setter. This is especially true since properties have an implicit expectation of being "lightweight"- and displaying a MessageBox to the user really violates that expectation.
You cannot provide your own implementation for the setter when using automatic properties. In other words, you should either do:
public int Hour { get;set;} // Automatic property, no implementation
or provide your own implementation for both the getter and setter, which is what you want judging from your example:
public int Hour
{
get { return hour; }
set
{
if (value < MIN_HOUR)
{
hour = 0;
MessageBox.Show("Hour value " + value.ToString() + " cannot be negative. Reset to " + MIN_HOUR.ToString(),
"Invalid Hour", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
//take the modulus to ensure always less than 24 hours
//works even if the value is already within range, or value equal to 24
hour = value % MAX_HOUR;
}
}
}
You need to either provide a body for both the getter and setter, or neither. Since you have non-trivial logic in your setter, you need a manually-implemented getter like so:
get { return _hour; }
If you decide you don't need the logic in the setter, you could go with an automatically-implemented property like so:
public int Hour { get; set; }
You DO NOT have to provide a body for getters and setters IF you'd like the automated compiler to provide a basic implementation.
This DOES however require you to make sure you're using the v3.5 compiler by updating your web.config to something like
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
I got the same error message because I had a function with a parameter named with a reserved word.
public int SaveDelegate(MyModel.Delegate delegate)
Renaming the variable delegate solved the problem.
You can just use the keywork value to accomplish this.
public int Hour {
get{
// Do some logic if you want
//return some custom stuff based on logic
// or just return the value
return value;
}; set {
// Do some logic stuff
if(value < MINVALUE){
this.Hour = 0;
} else {
// Or just set the value
this.Hour = value;
}
}
}
must declare a body because it is not marked abstract, extern, or partialI had the same problem here:
private static void swapMth(ref int x, ref int y);
{
int num = x;
x = y;
y = num;
}
private void button_Click(object sender, EventArgs e)
{
int x = 10;
int y = 20;
labelResult.Text = $"Befor n1 = {x} , n2={y} ";
swapMth(ref x, ref y);
labelResult.Text += $"\n After n1 = {x} , n2={y}";
}
And it was solved by deleting ";" from the method line:
private static void swapMth(ref int x, ref int y); PROBLEM
to
private static void swapMth(ref int x, ref int y) SOLVED
I know it is basic mistake, hope someone could get help by this note.
private static void swapMth(ref int x, ref int y)
{
int num = x;
x = y;
y = num;
}
private void button_Click(object sender, EventArgs e)
{
int x = 10;
int y = 20;
labelResult.Text = $"Befor n1 = {x} , n2={y} ";
swapMth(ref x, ref y);
labelResult.Text += $"\n After n1 = {x} , n2={y}";
}
精彩评论