Reputation: 2539
Let me start off by stating that I know the assignment operator in C# cannot be overloaded/overridden. However, if I have a class like so:
public class Time
{
private int Hour, Minute;
public int minutes;
public Time(int m)
{
this.minutes = m;
this.Hour = m / 60;
this.Minute = m % 60;
}
public Time(int hh, int mm)
{
this.minutes = 60 * hh + mm;
this.Hour = hh;
this.Minute = mm;
}
public static explicit operator Time(int i1)
{
return new Time(i1);
}
}
Two things:
1) Is the explicit conversion overload at the bottom necessary?
2) I want to do
Time newTime = 510;
and have Hour and Minute reflect the new minutes. Without making another object, is the only way to make a function like so:
public void changeminutes(int m)
{
this.minutes = m;
this.Hour = m / 60;
this.Minute = m % 60;
}
and do this:
Time newTime = new Time();
newTime.changeminutes(510);
edit:
I probably should have mentioned that I'm still in learning C#. A lot of your suggestions are flying over my head. Sorry.
next edit : This isn't necessarily about time. I just used it to illustrate my example.
Upvotes: 2
Views: 1428
Reputation: 22332
First, you want to use implicit
casting to achieve Time x = 123;
, but as others are pointing out it's probably a poor design choice because it's not immediately clear what the number represents (and most people would assume a Unix timestamp).
Second, why not use the Minutes property to set minutes, and simply convert the value into the proper value, while changing Hours?
time.Minutes = 510;
// in class def:
public int Minutes
{
get { return minutes; }
set
{
hours = value / 60;
minutes = value % 60;
}
}
Upvotes: 0
Reputation: 7342
For you case an implicit conversion would work but...
Conversions are not to be used when you loose data, or even semantics like in this case. You know that the number will become a Time, but you don't know which unit of time will the number be converted into.
If somebody is going to read the code it will not have any clue what the number represents without looking at the internal definition of the Time class. Think if that was in an outside project. Debugging hell? :)
Upvotes: 0
Reputation: 16708
It looks like you're trying to make a reference type behave like a value type, which is... um, tricky. If you really don't want to use the constructor for this (and explaining why that is might help us answer), you can use a static "factory" method:
public static Time FromMinutes(int m)
{
return new Time(m);
}
And use it like this:
var t = Time.FromMinutes(510);
This is similar to what the TimeSpan class lets you do.
Upvotes: 1
Reputation: 887365
You can create an implicit cast from int
to Time
.
However, I recommend against it.
Unless they're between equivalent types (eg, int
and long
), implicit casts will end up creating lots of confusion.
In addition, it isn't obvious that that should mean minutes and not seconds.
You can create a much nicer syntax using extension methods:
Time t = 510.Minutes();
Upvotes: 4