首先让我说明我知道C#中的赋值运算符不能被重载/重写。但是,如果我有这样的课程:
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);
}
}
两件事:
1)底部的显式转换过载是否必要?
2)我想做
Time newTime = 510;
并且小时和分钟反映新的分钟。没有制作另一个对象,是制作这样一个函数的唯一方法:
public void changeminutes(int m)
{
this.minutes = m;
this.Hour = m / 60;
this.Minute = m % 60;
}
并执行此操作:
Time newTime = new Time();
newTime.changeminutes(510);
编辑:
我可能应该提到我还在学习C#。很多你的建议都飞过我的脑海。遗憾。
下一个编辑: 这不一定是时间。我只是用它来说明我的例子。
答案 0 :(得分:3)
您可以创建从int
到Time
的隐式演员。
但是,我建议不要这样做
除非它们介于等效类型之间(例如,int
和long
),否则隐式强制转换最终会造成很多混乱。
此外,这不应该是指分钟而不是秒。
您可以使用扩展方法创建更好的语法:
Time t = 510.Minutes();
答案 1 :(得分:1)
看起来你正试图让引用类型表现得像一个值类型,这是......呃,很棘手。如果您真的不想使用构造函数(并解释为什么这可能有助于我们回答),您可以使用静态“工厂”方法:
public static Time FromMinutes(int m)
{
return new Time(m);
}
并像这样使用它:
var t = Time.FromMinutes(510);
这类似于TimeSpan class允许你做的事情。
答案 2 :(得分:0)
对于你的情况,隐式转换会起作用但是......
当您丢失数据时,不会使用转换,甚至在这种情况下也不会使用语义。您知道该号码将成为时间,但您不知道该号码将转换为哪个时间单位。
如果有人要阅读代码,那么在不查看Time类的内部定义的情况下,它将不知道数字代表什么。想想那是否属于外部项目。调试地狱? :)
答案 3 :(得分:0)
首先,你想使用implicit
施法来实现Time x = 123;
,但正如其他人指出它可能是一个糟糕的设计选择,因为它不能立即清楚数字代表什么(并且大多数人会假设一个Unix时间戳)。
其次,为什么不使用Minutes属性设置分钟,只需将值转换为适当的值,同时更改小时数?
time.Minutes = 510;
// in class def:
public int Minutes
{
get { return minutes; }
set
{
hours = value / 60;
minutes = value % 60;
}
}