Невозможно неявно преобразовать тип int? в 'int'.

Я получаю сообщение об ошибке «Невозможно неявно преобразовать тип int?» в 'int'. Явное преобразование существует (вы пропустили приведение?) "в моем OrdersPerHour в строке возврата. Я не уверен, почему, потому что мои навыки C # не так уж высоки. Любая помощь будет оценена.

static int OrdersPerHour(string User)
{
    int? OrdersPerHour;
    OleDbConnection conn = new OleDbConnection(strAccessConn);
    DateTime curTime = DateTime.Now;        

    try
    {
        string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = '" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');";
        OleDbCommand dbcommand = new OleDbCommand(query, conn);
        dbcommand.Connection.Open();
        dbcommand.CommandType = CommandType.Text;
        OrdersPerHour = (int?)dbcommand.ExecuteScalar();

        Console.WriteLine("Orders per hour for " + User + " is " + OrdersPerHour);            
    }
    catch (OleDbException ex)
    {

    }
    finally
    {
        conn.Close();
    }
    return OrdersPerHour;
}

person MaylorTaylor    schedule 28.05.2013    source источник


Ответы (9)


Ну, вы бросаете OrdersPerHour на int?

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

Тем не менее, ваша подпись метода int:

static int OrdersPerHour(string User)

Эти двое должны соответствовать.


Также быстрое предложение -> Используйте параметры в своем запросе, например:

string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > ? AND User = ? AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered')";
OleDbCommand dbcommand = new OleDbCommand(query, conn);
dbcommand.Parameters.Add(curTime.AddHours(-1));
dbcommand.Parameters.Add(User);
person Dimitar Dimitrov    schedule 28.05.2013
comment
Теперь я понимаю свою ошибку в этой части. Но после внесения этих изменений я получаю пользователя неназначенной локальной переменной «OrdersPerHour» в строке возврата. - person MaylorTaylor; 28.05.2013
comment
@MaylorTaylor Измени int? OrdersPerHour; на int OrdersPerHour = 0;, надо об этом позаботиться. - person Dimitar Dimitrov; 28.05.2013
comment
Хорошо, это исправило меня прямо сейчас; Однако теперь у меня другая проблема. stackoverflow.com/questions/16744510/ - person MaylorTaylor; 28.05.2013

это потому, что тип возвращаемого значения вашего метода - int, а OrdersPerHour - int? (обнуляемый), вы можете решить эту проблему, вернув его значение, как показано ниже:

return OrdersPerHour.Value

также проверьте, не является ли оно нулевым, чтобы избежать исключения, как показано ниже:

if(OrdersPerHour != null)
{

    return OrdersPerHour.Value;

}
else
{

  return 0; // depends on your choice

}

но в этом случае вам нужно будет вернуть какое-то другое значение в части else или после части if, иначе компилятор отметит ошибку, которая не соответствует всем путям возврата значения кода.

person tariq    schedule 28.05.2013

Вы можете изменить последнюю строку на следующую (при условии, что вы хотите вернуть 0, когда в db ничего нет):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value;
person loopedcode    schedule 28.05.2013

Первая проблема, с которой сталкивается ваш код, - это сообщение

Локальная переменная OrdersPerHour может быть не инициализирована перед доступом.

Это происходит потому, что в случае, когда ваш запрос к базе данных выдает исключение, значение может быть не установлено для чего-то (у вас есть пустое предложение catch).

Чтобы исправить это, установите значение, которое вы хотели бы иметь в случае сбоя запроса, что, вероятно, будет 0:

int? OrdersPerHour = 0;

Как только это будет исправлено, появится ошибка, о которой вы публикуете. Это происходит потому, что ваша подпись метода объявляет, что вы возвращаете int, но на самом деле вы возвращаете обнуляемую переменную int, int?,.

Итак, чтобы получить int часть вашего int?, вы можете использовать свойство .Value:

return OrdersPerHour.Value;

Однако, если вы объявили, что для параметра OrdersPerHour в начале было указано null, а не 0, значение может быть нулевым, поэтому, вероятно, потребуется правильная проверка перед возвратом (например, вызовите более конкретное исключение).

Для этого вы можете использовать свойство HasValue, чтобы убедиться, что у вас есть значение, прежде чем возвращать его:

if (OrdersPerHour.HasValue){
    return OrdersPerHour.Value;
}
else{
    // Handle the case here
}

В качестве примечания, поскольку вы кодируете на C #, было бы лучше, если бы вы следовали соглашениям C #. Ваш параметр и переменные должны быть в camelCase, а не в PascalCase. Итак, User и OrdersPerHour будут user и ordersPerHour.

person Pierre-Luc Pineault    schedule 28.05.2013

Проверьте объявление вашей переменной. Это должно быть так

public Nullable<int> x {get; set;}
public Nullable<int> y {get; set;}
public Nullable<int> z {get { return x*y;} }

Надеюсь, это будет вам полезно

person Adem El Awity    schedule 22.05.2020

Тип возврата вашего метода - int, и вы пытаетесь вернуть int?.

person cassiorgr    schedule 28.05.2013

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

Этот оператор следует набирать как, OrdersPerHour = (int)dbcommand.ExecuteScalar();

person Josh    schedule 28.05.2013

Если вас беспокоит возможное возвращаемое значение null, вы также можете запустить что-то вроде этого:

int ordersPerHour;  // can't be int? as it's different from method signature
// ... do stuff ... //
ordersPerHour = (dbcommand.ExecuteScalar() as int?).GetValueOrDefault();

Таким образом вы справитесь с потенциально неожиданными результатами, а также сможете указать значение по умолчанию для выражения, введя .GetValueOrDefault(-1) или что-то более значимое для вас.

person Rubens Farias    schedule 17.10.2017

просто

(i == null) ? i.Value : 0;
person HoQuocThinh    schedule 09.09.2015
comment
Хотя это теоретически может работать, это никому не объясняет, как это работает. Сказать просто - на самом деле недостаточно. - person Wai Ha Lee; 09.09.2015
comment
.. Это определенно не сработает. У вас есть NullReferenceException, когда i == null, и возвращает 0, когда его нет. - person Wai Ha Lee; 09.09.2015