C # перегрузочные свойства - PullRequest
1 голос
/ 04 февраля 2012

Я хочу, чтобы мой объект мог набирать double или string , например, получать данные о зарплате.У меня есть код, работающий со свойством, которое допускает только double .Я знаю, что перегрузка свойств не поддерживается другими публикациями на этом сайте.Я также знаю, что сеттеры позволят мне получить строковый ввод для зарплаты.Я не понимаю, как перегрузить.У меня есть некоторые из кода шаблона здесь:

private double salary = 20000;

public Employee()
{
}

public Employee(double sal)
{
    salary = sal;
}

public double Salary
{
    get { return salary; }
    set { salary = value; }
}

public void SetSalary(string sal)
{
    salary = Convert.ToString(sal);       
}

Код ошибки:

не может неявно скрыть строку типа для удвоения

Я хочубыть в состоянии иметь объект, чтобы быть в состоянии перегрузить зарплату, используя установщик в C #.Я студент и понимаю большинство основ.Заранее спасибо за любую помощь.

Ответы [ 5 ]

3 голосов
/ 04 февраля 2012
public void SetSalary(string sal) 
{ 
    salary = Convert.ToString(sal);        
} 

Вы преобразовываете параметр , который уже является строкой , в строку и пытаетесь присвоить его полю типа double.

salary = Convert.ToDouble(sal); // one way
salary = double.Parse(sal); // another way 

Обратите внимание, что эти преобразования могут завершиться неудачей, если строка имеет неправильный числовой формат. double.TryParse может быть полезно, но, вероятно, это исключение, которое должно распространяться на ваших абонентов, когда они отправляют неверный ввод. Учитывая все вышесказанное, я бы оставил вашим вызывающим сторонам преобразовать значение в соответствующий тип и просто раскрыть свойство double. Нет необходимости усложнять ситуацию в вашем классе.

В этом отношении для значения, которое должно представлять заработную плату, вам следует рассмотреть возможность использования более подходящего типа decimal. Он предназначен для хранения финансовых ценностей.

 decimal salary; 
 // elsewhere
 salary = Convert.ToDecimal(sal);
 salary = decimal.Parse(sal);
1 голос
/ 04 февраля 2012
salary = Convert.ToString(sal);   

Вы снова конвертируете строку sal в строку с помощью ToString?И тогда вы пытаетесь присвоить ему двойную зарплату.

1 голос
/ 04 февраля 2012

Оскорбительная строка

salary = Convert.ToString(sal);

Это говорит: установите приватное поле salary равным строковому представлению sal. Но приватное поле salary на самом деле double! Вы, вероятно, хотите что-то вроде

public void SetSalary(string sal)
{
    salary = double.Parse(sal);       
}

Или, если вам не нравится использовать исключения для ошибок, используйте double.TryParse .

1 голос
/ 04 февраля 2012

Это избавит от ошибки, которую вы описываете:

public void SetSalary(string sal)
{
    salary = Convert.ToDouble(sal);
}
0 голосов
/ 04 февраля 2012
// Note that this has been shortened.  The compiler will take care of making a backing field for us; we don't need to worry about it.
public double Salary { get; set; }

public Employee()
{
    // Only set the default value for Salary in the parameterless constructor.
    Salary = 20000.0;
}

public Employee(double salary)
{
    // Notice how the parameter names are more verbose.
    Salary = salary;
}

public void SetSalary(string value)
{
    double salary;
    // TryParse allows us to handle errors manually, rather than dealing with (slow) exceptions.
    if (double.TryParse(value, out salary))
    {
        Salary = salary;
    }
    else
    {
        // We should really do something other than just throw an exception here, but that's what I'm doing for example purposes.
        throw new ArgumentException("Argument must be parsable as a double.", "value");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...