【问题标题】:C# Overloading Invalid ArgumentsC# 重载无效参数
【发布时间】:2015-08-18 05:23:59
【问题描述】:

我对 C# 很陌生,如果我的编码有点狡猾,很抱歉! 我的 People 应用程序不断收到 3 个错误。
这些错误是由于试图将 int 和 bools 转换为字符串引起的,我只是不确定我打算如何更改它,如果你们能帮我一把,那将非常感谢!任何提示也将不胜感激! 不断重复出现的错误是:

  • 错误 1:最佳重载方法匹配 'Lab5b.Person.Person(string, int, string, string, bool, string)' 有 一些无效参数

  • 错误 2:参数 2:无法从 'string' 转换为 'int'

  • 错误 3:参数 5:无法从“方法组”转换为“布尔”

我的代码:

public partial class _Default : Page
    {

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write("You have successfully added a Person!");

            Person p = new Person(TextBox1.Text, TextBox2.ToString(), TextBox3.Text, TextBox4.Text, DropDownList1.ToString, TextBox5.Text);
        }
    }

还有我的 Person 类:

class Person
{
    private string name;
    private int age;
    private string dob;
    private string telNo;
    private bool gender;
    private string address;

    public Person(string name, int age, string dob, string telNo, bool gender, string address)
    {
        Name = name;
        Age = age;
        DOB = dob;
        TelNo = telNo;
        Gender = gender;
        Address = address;
    }

    public int Age { get; set; }
    public string Name { get; set; }
    public string DOB {get; set;}
    public string TelNo {get; set;}
    public bool Gender {get; set;}
    public string Address {get; set;}

    public string PresentPerson()
    {

    }
}

【问题讨论】:

标签: c#


【解决方案1】:

你有很多问题。

  • 首先,当“Age”参数需要 int 时,您将 TextBox2 中的值作为字符串传递。
  • 其次,您将 DropDownList1 值作为方法组传递,因为您没有关闭参数 ()
  • 第三,如果你正确地调用了.ToString(),你就会将一个字符串值传递给一个期望布尔值的参数。
  • 第四,引用控件本身 TextBox2 而不是文本框的值会给你一个意想不到的错误结果。
  • 第五,您实际上并没有检索下拉列表的选定值,而是试图传递控件本身。

.

protected void Button1_Click(object sender, EventArgs e)
{
    Response.Write("You have successfully added a Person!");

    Person p = new Person(TextBox1.Text, int.Parse(TextBox2.Text.ToString()), 
        TextBox3.Text, TextBox4.Text, bool.Parse(DropDownList1.SelectedValue.ToString()), 
        TextBox5.Text);
}

对于 Gender,代码假设您的下拉列表值是 True 或 False,以便它们可以被适当地解析,没有空条目或不同值的条目(例如男性/女性)。

另外,值得注意的是,如果这些解析不能完全正确,它们会抛出异常。最好使用TryParse 并验证您的数据是否与您认为的一样。

protected void Button1_Click(object sender, EventArgs e)
{
    Response.Write("You have successfully added a Person!");

    int age;
    bool gender;

    int.TryParse(TextBox2.Text.ToString(), out age);
    bool.TryParse(DropDownList1.SelectedValue, out gender);

    Person p = new Person(TextBox1.Text, age, TextBox3.Text, TextBox4.Text, gender, 
                    TextBox5.Text);
}

【讨论】:

    【解决方案2】:

    您正在使用此行调用构造函数人员:

    Person p = new Person(TextBox1.Text, TextBox2.ToString(), TextBox3.Text, TextBox4.Text, DropDownList1.ToString, TextBox5.Text);
    

    请注意,TextBox.Text 是字符串类型。

    您的个人构造函数的签名为:

    public Person(string name, int age, string dob, string telNo, bool gender, string address)
    

    这意味着第二个和第五个参数需要分别是和 int 和 bool。如果用户在文本框中正确输入数据并且下拉列表具有正确的值,您可以使用 Convert 类来获得正确的表单:

    Person p = new Person(TextBox1.Text, Convert.ToInt32(TextBox2.Text), TextBox3.Text, TextBox4.Text, Convert.ToBoolean(DropDownList1.SelectedValue), TextBox5.Text);
    

    调用 TextBox2.ToString() 是试图将对象转换为字符串,不一定是文本框中的文本。同样对于下拉列表,您应该在其中使用 SelectedText 或 SelectedValue,具体取决于您的设置方式。

    在您的 Person 类定义中,您还定义了两次字段。

    private string name;
    private int age;
    private string dob;
    private string telNo;
    private bool gender;
    private string address;
    

    public int Age { get; set; }
    public string Name { get; set; }
    public string DOB {get; set;}
    public string TelNo {get; set;}
    public bool Gender {get; set;}
    public string Address {get; set;}
    

    确保您只定义一次字段。如果您尝试使用私有字段和公共属性,通常的做法是为私有字段名称使用驼峰命名法,为属性使用 PascalCase。还应定义属性以访问私有字段:

    private string name;
    
    public string Name { get { return name; } set { name = value; } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多