我正在尝试从单独的程序中提取日期并使用它来确定合同的到期日期。我已经为月份和年份调用了int,然后使用DateTime分配给另一个var。
我是C#的新手,并且无法找到解决此块所带来的错误的方法。错误告诉我它不能隐式转换int?到int,当我使用int? var声明日期月份和年份然后将错误向下移动到DateTime行。
这可能需要采用不同的结构,但我无法弄清楚会采用什么方式。
<span class="infoValue">
<span class="value">
<span class="currencyLeft">$</span>
1000
</span>
</span>
//span[@class='infoValue']//span[@class='value']
答案 0 :(得分:3)
一个可以为空的整数(int?
)不能转换为传统的整数(int
),因为有些情况可能是null,而你需要确定你想要的方式处理这样的场合。
考虑解析或使用默认值
当您的可空值为null时,您需要确定要发生的内容。默认情况下,可为空的整数会显示HasValue
属性,您可以将其用作默认值,或者可以考虑使用null-propagation运算符来处理此问题:
// 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"); }
您可以允许它冒泡到适当的位置并在您的应用程序中相应地处理它(即通知用户,记录问题等)。
答案 1 :(得分: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
1}}和month
是null
DateTime
- 构造函数需要DateTime(int year, int month, int day)
- 他不想得到例如null
一个月是sampleresult.default.encoding=UTF-8
答案 2 :(得分:0)
假设ExpirationDate.<properties>
是int?
s,如果关注的是ExpirationDate
是否存在,那么您是否应该 em>是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);
}
}