2017-01-24 3 views
0

Я пытаюсь вытащить дату из отдельной программы и использовать ее для определения сроков действия контрактов. Я назвал int's для месяца и года месяца, а затем использовал DateTime для назначения другому var.Проблемы с преобразованием типа int? к int. Отсутствует актерский состав?

Я довольно новичок в C# и не могу найти работу для ошибки, которую я получаю с этим блоком. Ошибки говорят мне, что он не может неявно преобразовать int? int, когда я использую int? var, чтобы объявить день месяца и год, затем сдвигает ошибку до строки DateTime.

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

private Instrument m_instr = null; 

private void m_getInstrDetails(Instrument instr) 
{ 
    m_ContractName = instr.Name.ToString(); 
    m_type = instr.Product.Type.ToString(); 
    m_prod = instr.Product.ToString(); 
    m_SmallestTickIncrtement = instr.InstrumentDetails.SmallestTickIncrement; 


    //month calc 
    int month = m_instr.InstrumentDetails.ExpirationDate.Month; 
    int day = m_instr.InstrumentDetails.ExpirationDate.Day; 
    int year = m_instr.InstrumentDetails.ExpirationDate.Year; 

    m_expDate1 = new DateTime(year, month, day); 
+0

Ну предположительно 'ExpirationDate.Month' имеет тип' межд? ',' Не int'. Трудно сказать без '[mcve]'. (Мы не знаем, для чего используется тип 'Instrument'.) –

+0

Что вы ожидаете, если значение« null »? – Servy

+0

Пожалуйста, предоставьте определения 'Intrument' и' InstrumentDetails'. – bradbury9

ответ

1

int? является Nullable типа, что означает, что ваш int также может быть null.

Вы получаете значение по

int? month = m_instr.InstrumentDetails.ExpirationDate.Month; 
int month = month.Value; 

вы могли бы проверить, если month не null по

bool monthIsNotNull = month.HasValue; 

, потому что вы могли бы получить исключение при попытке инициализации DateTime -переменных когда month является null - или, по крайней мере, при попытке получить int через month.Value и month - null

DateTime -конструктор хочет DateTime(int year, int month, int day) - он не хочет получать, например. в месяц это null

3

обнуляемого целое (int?) не может быть приведен к традиционным целого (int), так как существуют ситуации, в которых один может быть пустым, и вы должны будете определить, как вы хотите обрабатывать такие случаи.

Рассмотрим Синтаксический или Использование Значение по умолчанию

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

// This will use the expiration date if it exists, otherwise it will use 1 
int month = m_instr.InstrumentDetails.ExpirationDate?.Month ?? 1; 

Другой вариант включает в себя установку начального значения и используя int.TryParse() метод для обновления значения до использования:

int month = 1; 
int.TryParse(m_instr.InstrumentDetails.ExpirationDate?.Month, out month); 

Учитывая Бросив Exception

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

if(!month.HasValue) { throw ArgumentException("month"); } 

Вы можете позволить это пузыриться до соответствующего места и обработать его соответствующим образом в вашем приложении (т.е. уведомлять пользователя, регистрировать проблему и т. д.)

+0

для оператора NULL-распространения и установки значения по умолчанию в одной строке +1 –

0

Предполагая, что ExpirationDate.<properties> ваши int? s, если беспокойство, является ли или не существует ExpirationDate, не должны вы видите, если что является null вместо этого? Тогда вы могли бы просто использовать регулярные ints в качестве свойств объекта ExpirationDate .:

private void m_getInstrDetails(Instrument instr) 
    { 
     m_ContractName = instr.Name.ToString(); 
     m_type = instr.Product.Type.ToString(); 
     m_prod = instr.Product.ToString(); 
     m_SmallestTickIncrtement = instr.InstrumentDetails.SmallestTickIncrement; 

     if(InstrumentDetails.ExpirationDate != null) 
     { 
      //if you change the .Month, .Day, and .Year to int, and test against 
      //ExpirationDate, this will work fine       
      //month calc 
      int month = m_instr.InstrumentDetails.ExpirationDate.Month; 
      int day = m_instr.InstrumentDetails.ExpirationDate.Day; 
      int year = m_instr.InstrumentDetails.ExpirationDate.Year; 
      m_expDate1 = new DateTime(year, month, day); 
     } 
    } 
Смежные вопросы