2017-01-24 37 views
0

我想從一個單獨的程序中提取一個日期,並用它來確定合同的到期日期。我已經在一天和一年中調用了int的值,然後使用DateTime分配給另一個變量。轉換類型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?','不是的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; 

你可以檢查得到的值,如果monthnull通過

bool monthIsNotNull = month.HasValue; 

因爲試圖初始化DateTime -variable時month是當你能得到一個異常null - 或者至少當試圖通過month.Valuemonth獲得int時是null

DateTime -constructor想要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); 

考慮拋出一個異常

如果你不想牛逼o允許出現這些類型的場景,並使用一些默認值是不可行的,你可以考慮只拋出一個異常:

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

可以讓這個冒泡到合適的位置,並據此內處理它的應用程序(即通知用戶,記錄問題等。)

+0

爲空傳播運算符並在一行中設置默認值+1 –

0

假設​​是你int? S,如果關心的是是否有一個ExpirationDate,你不應該看是否null呢?然後,你可以只使用常規的intsExpirationDate對象:

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); 
     } 
    } 
相關問題