以下 c# 代码中 属性 成人的堆栈溢出异常

stack overflow exception for the property adult in the below c# code

该代码用于获取用户的输入,例如他们的姓名和出生日期以及 return 姓名和年龄以及他们是否 child 等详细信息

除了 Adult 属性 其余代码工作正常

using System;
using System.IO;

public class Person
{
    //Fill code here
    private string firstName;
    private string lastName;
    private DateTime dob;
    //private string adult;

    public string FirstName
    {
        set { firstName = value; }
        get { return firstName; }
    }

    public string LastName
    {
        set { lastName = value; }
        get { return lastName; }
    }

    public DateTime Dob
    {
        set { dob = value; }
        get { return dob; }
    }
}

在下面 属性 它必须检查年龄和 return 如果年龄大于或等于 18 岁则为“成人”,否则为“Child”。

根据问题,我无法为此声明该字段。

public string Adult
{
    get
    {
        return Adult;
        throw (Whosebug)
    }
    set
    {
        if (GetAge(dob) >= 18)
        {
            Adult = "Adult";
        }
        else
        {
            Adult = "Child";
        }
    }
}

帮我修正上面的问题属性,让它不会抛出任何异常,以及抛出异常的原因

public void DisplayDetails()
{
    Console.WriteLine("First Name: {0}", firstName);
    Console.WriteLine("Last Name: {0}", lastName);
    int age = GetAge(dob);
    Console.WriteLine("Age: {0}",age);
    Console.WriteLine(Adult);
    }
    
    public int GetAge(DateTime dob)
    {
        int age = 0;
        age = DateTime.Now.Year - dob.Year;
        return age;    
    }
}

public class Program
{
    public static void Main(String[] args)
    {
        //Fill code here
        Person p = new Person();
        Console.WriteLine("Enter first name");
        p.FirstName = Console.ReadLine();
        Console.WriteLine("Enter last name");
        p.LastName = Console.ReadLine();
        Console.WriteLine("Enter date of birth in yyyy/mm/dd/ format");
        p.Dob = Convert.ToDateTime(Console.ReadLine());
        
        p.DisplayDetails();
    }
}

您有一个 Adult 属性,并且在 属性 中您手动定义了一个 getter 和 setter,但它们都使用完全相同的 属性 而不是像在其他属性中那样使用字段。

请注意,您的其他属性中使用的字段名称为小写,而属性以大写字母开头(这意味着它们是独立的实体)。

所以你确实这样声明了 adult 但注释掉了:

//private string adult;

所以你需要先取消注释,然后在你的 getter & setter.

中使用它
public string Adult
    {
        get
        {
            return adult;
        }  
        set
        {
            if (GetAge(dob) >= 18)
            {
                adult = "Adult";
            }
            else
            {
                adult = "Child";
            }
        }
    }

但这也没有意义,因为您的 setter 没有使用您传递给它的值!因此,虽然这可能有效,但它并不是最好的方法。如果每次都是成人或儿童,只需使用 Getter 到 return。

 public string Adult
  {
        get
        {
            if (GetAge(dob) >= 18)
                     return "Adult";
            else
                return "Child";
        }
}

(您还应该包括处理 dob 值无效的情况(例如默认值)

顺便说一句:最好使用枚举而不是字符串,或者只使用布尔值来指示它是成人 (true) 还是儿童 (false)。