在.net中重载DateTime的运算符

时间:2014-05-28 13:20:44

标签: .net operator-overloading

需要在.net中执行此操作,因为此Date + Number代码来自转换后的旧VB6代码,并且这些代码未输入,因此我无法检测编译时间何时发生。所以我正在寻找一种解决方案,我不需要知道它何时出现在我的代码中。

DateTime date = DateTime.Now + 1

当我收到一个号码时,我将其作为日期中的日期加总,所以我开始制作这个:

public static DateTime operator +(DateTime c1, int c2)
{
    return c1.AddDays(c2);
}

然而它会抛出此错误:

  

二元运算符的一个参数必须是包含类型

我如何获得这个Datetime + Int运算符?

选择正确答案后编辑:

  1. 我选择了@Marc Gravell的答案,因为他解释说我想要做的事情是不可能的,并且他提供了一个更清洁的解决方案,而不是铸造未知类型并且手动使用.AddDays < / p>

  2. 如果您遇到同样的麻烦,因为您无法在编译类型中检测到这些无类型错误,@ Matt Wilko提供了一个很棒的线索,转向VB.Net制作的 Option Strict Off 从VB6转换为 On 。它不会解决问题,因为即使我在进行Number + Number操作时它也会检测到错误,但是在编译时发生Date + Number时会有很多帮助。解决了日期+数字问题后,我会再次将 Option Strict 转为 Off

  3. 谢谢你们两个人!

2 个答案:

答案 0 :(得分:3)

  

需要在.net

中执行此操作

坚韧。你不能 - 至少不能在C#中。有时正确的答案是“不”。编译器消息告诉您原因:运算符只能在所涉及的两种类型上声明,即在此场景中必须在intDateTime上定义运算符。

例如,您可以在int上添加一个扩展方法,以便您可以执行以下操作:

DateTime date = DateTime.Now + 1.Days();

通过:

public static TimeSpan Days(this int value) {
    return TimeSpan.FromDays(value);
}

答案 1 :(得分:1)

您的VB6代码正在使用Recordset(我实际上建议您重新编写以首先使用ADO.NET) - 这会返回一个Object类型。

为了能够对它做任何事情,你需要把它投到日期:

//Simulate the read of the recordset field object
Object dateObject = DateTime.Now;
//cast the object to a date and add a day to it
DateTime date = (DateTime)(dateObject) + TimeSpan.FromDays(1);