以下代码使用comparison运算符可以正常编译。

If(dateTimeVariable > SqlDateTime.MinValue) //compiles Ok. dateTimeVariable is of type DateTime
{
}


但是,以下代码无法编译。

DateTime dateTimeVariable=SqlDateTime.MinValue;
//Throws exception , cannot convert source type SqlDateTime to DateTime. Which is obvious.


我的问题是,为什么comparisonSqlDateTime类型之间允许使用Datetime,但不允许assignment。 (除非comparison运算符进行某些implicit转换。)

我猜我一定会缺少一些真正的基本知识。

最佳答案

SqlDateTime中有一个隐式转换,无需任何额外的工作即可将DateTime转换为SqlDateTime

public static implicit operator SqlDateTime(DateTime value)
{
    return new SqlDateTime(value);
}

// SqlDateTime mySqlDate = DateTime.Now


必须发生的是,将dateTimeVariableDateTime隐式转换为SqlDateTime进行比较:

if (dateTimeVariable > SqlDateTime.MinValue)
{
    // if dateTimeVariable, after conversion to an SqlDateTime, is greater than the
    //  SqlDateTime.MinValue, this code executes
}


但是在以下代码的情况下,没有什么可以让您简单地将SqlDateTime填充到DateTime变量中,因此它是不允许的。

DateTime dateTimeVariable = SqlDateTime.MinValue;  // fails


转换初始值,它将可以编译,但是有可能您会丢失一些有价值的信息,这些信息属于SqlDateTime而不是DateTime

DateTime dateTimeVariable = (DateTime)SqlDateTime.MinValue;

10-06 09:32