【问题标题】:Problems with converting type int? to int. Missing a cast?转换类型 int 的问题?诠释。缺少演员表?
【发布时间】:2017-06-09 13:47:59
【问题描述】:

我正在尝试从一个单独的程序中提取一个日期,并使用它来确定合同的到期日期。我已经为月日和年调用了 int,然后使用 DateTime 分配给另一个 var。

我对 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);

【问题讨论】:

  • 嗯,大概ExpirationDate.Month 的类型是int?,而不是int。没有[mcve] 很难说。 (首先,我们不知道 Instrument 类型是什么。)
  • 如果值为null,您期望会发生什么?
  • 请提供IntrumentInstrumentDetails 的定义。
  • 是的,ExpirationDate.Month 是 int?,inst 是私有 Instrument m_instr = null;
  • 这些值是可选的吗?如果没有,则抛出异常。 if(day.HasValue == false) throw new ArgumentException() 其他明智的做法是提供默认值,day ?? 1

标签: c#


【解决方案1】:

可空整数 (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);

考虑抛出异常

如果你不想让这些类型的场景发生并且使用一些默认值是不可行的,你可以考虑只抛出一个异常:

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

您可以让它冒泡到适当的位置并在您的应用程序中相应地处理它(即通知用户、记录问题等)

【讨论】:

  • 用于 null-propagation-operator 并在一行中设置默认值 +1
【解决方案2】:

int?Nullable 类型,这意味着您的int 也可以是null

你得到的价值是

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

如果month 不是null,您可以通过

bool monthIsNotNull = month.HasValue;

因为当monthnull 时尝试初始化DateTime 变量时,您可能会遇到异常 - 或者至少,当尝试通过month.Valuemonth 获取int 时,month 是@987654335 @

DateTime-constructor 想要DateTime(int year, int month, int day) - 他不想得到例如一个月null

【讨论】:

    【解决方案3】:

    假设ExpirationDate.<properties> 是您的int?,如果担心是否存在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);
             }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多