-1

我有一个财产DateOfBirth和一个财产Age

DateOfBirthDateTime数据类型,Ageint数据类型。

我想在构造函数中计算人的年龄,我有:

private int CalculateAge(DateTime birthDate, DateTime now)
{
   int age = now.Year - birthDate.Year;
   if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day))
   {
      age--;
   }            
   return age;
}

public virtual DateTime? Dob { get; set; }
public virtual int Age { get; set; }

public MyObject()
{
   Age = CalculateAge(Dob, DateTime.Now);
}

在编译时,我收到以下错误:

最佳重载方法匹配 ... 有一些无效参数

无法从“System.DateTime”转换?到 System.DateTime

4

9 回答 9

3

最好的重载方法匹配 .... 有一些无效的参数,不能从 'System.DateTime?' 转换 到 System.DateTime

那么你是怎么解决这个问题的呢?错误很明显:您将System.DateTime?参数传递给接受System.DateTime.

要修复它,请更改方法签名

CalculateAge(DateTime? birthDate, DateTime now)
{
    if (!birthDate.HasValue)
    {
        return -1; // ?
    }
}

但正如你所见,这完全没用。所以改变调用:

if (Dob.HasValue)
{
    Age = CalculateAge(Dob.Value, DateTime.Now);
}

最终,您只想为此使用一个属性:

public virtual int Age { 
    get
    {
        if (!Dob.HasValue)
        {
            throw new Exception(); // ?
            return -1; // ?
        }

        return CalculateAge(Dob.Value);
    }
}

如您所见,在哪里解决这个问题并不重要:您只需要在某个地方检查可空 ( ?) 出生日期是否包含一个值。

于 2013-06-06T10:36:31.510 回答
2

您应该传递 DateTime 而不是可为空的 DateTime

Age = CalculateAge((Dob.HasValue ? Dob.Value : DateTime.Now), DateTime.Now);

或者改变接收方式

private int CalculateAge(DateTime? birthDate, DateTime now)

并应用避免 NullReferenceExceptions 所需的所有检查

于 2013-06-06T10:36:18.850 回答
1

CalculateAge的方法接受一个DateTime参数,并且您将其传递给一个DateTime?(可为空的DateTime)。您必须更改其中之一,或强制转换为DateTime.

此外,第二个参数没有真正的原因,DateTime.Now可以在方法内部计算。

第三,查看 SO 计算年龄的类似问题:Calculate age in C#

于 2013-06-06T10:34:31.280 回答
1

看看你的方法声明

private int CalculateAge(DateTime birthDate, DateTime now)

和 DateOfBirth 声明

public virtual DateTime? Dob { get; set; }

您不能将可为空的 DateTime 属性用作第一个参数。将声明更改为

private int CalculateAge(DateTime? birthDate, DateTime now)

或从 Dob 属性中删除可空性

public virtual DateTime Dob { get; set; }
于 2013-06-06T10:36:24.240 回答
0

您可以使用

public static int GetAge(DateTime birthDate)
{
DateTime n = DateTime.Now; // To avoid a race condition around midnight
int age = n.Year - birthDate.Year;

if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))
age--;

return age;
}
于 2013-06-06T10:35:54.810 回答
0
use private int CalculateAge(DateTime? birthDate, DateTime now)

代替

private int CalculateAge(DateTime birthDate, DateTime now)
于 2013-06-06T10:36:21.357 回答
0

使用 TimeSpan 获取此处提到的两个日期之间的差异:

private int CalculateAge(DateTime birthDate, DateTime now)
{
   TimeSpan span = now.Subtract(birthDate);     
   return (int)span.TotalDays / 365;  
}
于 2013-06-06T10:36:22.710 回答
0

更改方法定义并检查birthDate 是否有值(不为空)

private int CalculateAge(DateTime? birthDate, DateTime now)
{
   if(birthDate.HasValue)
   {
      int age = now.Year - birthDate.Year;
      if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day))
      {
         age--;
      }            
      return age;
   }
   else 
      return 0;
}
于 2013-06-06T10:36:24.650 回答
0

你将不得不投你的日期时间?像这样到 DateTime

(DateTime)Dob

但是,如果您没有处理代码中任何地方的空日期的可能性,为什么还要首先让 Dob 可以为空呢?

于 2013-06-06T10:40:11.607 回答