C# 转换int类型的问题?为了内景,错过一个演员?

C# 转换int类型的问题?为了内景,错过一个演员?,c#,C#,我试图从一个单独的程序中提取一个日期,并用它来确定合同的到期日期。我调用了月份、日期和年份的int,然后使用DateTime分配给另一个var 我对C#相当陌生,无法找到解决此块错误的方法。错误告诉我它不能隐式转换int?到int,当我使用int时?var来声明日期、月份和年份,然后将错误向下移动到日期时间行 这可能需要不同的结构,但我不知道这样会是什么 private Instrument m_instr = null; private void m_getInstrDetails(Inst

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

我对C#相当陌生,无法找到解决此块错误的方法。错误告诉我它不能隐式转换int?到int,当我使用int时?var来声明日期、月份和年份,然后将错误向下移动到日期时间行

这可能需要不同的结构,但我不知道这样会是什么

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

int?
是一种
null
-类型,也就是说,您的
int
也可以是
null

你可以通过

int? month = m_instr.InstrumentDetails.ExpirationDate.Month;
int month = month.Value;
如果
month
不是
null
,您可以通过

bool monthIsNotNull = month.HasValue;
因为当
month
null
-或至少当试图通过
month获取
int
时,尝试初始化
DateTime
-变量时可能会出现异常。值
month
null


DateTime
-构造函数想要
DateTime(int-year,int-month,int-day)
-他不想得到例如
null的月份
int?
是一个
可空的
-类型,这意味着
int
也可以是
null

你可以通过

int? month = m_instr.InstrumentDetails.ExpirationDate.Month;
int month = month.Value;
如果
month
不是
null
,您可以通过

bool monthIsNotNull = month.HasValue;
因为当
month
null
-或至少当试图通过
month获取
int
时,尝试初始化
DateTime
-变量时可能会出现异常。值
month
null

DateTime
-构造函数想要
DateTime(int-year,int-month,int-day)
-他不想得到例如
null的月份

一个可为null的整数(
int?
)不能转换为传统整数(
int
),因为存在可能为null的情况,你需要决定如何处理这种情况

考虑解析或使用默认值

您需要确定当可为null的值为null时希望发生什么。默认情况下,可空整数公开一个属性,您可以使用它来确定为默认值,或者可以考虑使用NULL传播操作符来处理:

// This will use the expiration date if it exists, otherwise it will use 1
int month = m_instr.InstrumentDetails.ExpirationDate?.Month ?? 1;
另一个选项涉及设置初始值,并在使用前使用该方法更新该值:

int month = 1;
int.TryParse(m_instr.InstrumentDetails.ExpirationDate?.Month, out month);
考虑引发异常

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

if(!month.HasValue) { throw ArgumentException("month"); }
您可以允许它冒泡到适当的位置,并在应用程序中相应地处理它(即通知用户、记录问题等)。

可为空的整数(
int?
)不能强制转换为传统整数(
int
),因为存在可能为空的情况,你需要决定如何处理这种情况

考虑解析或使用默认值

您需要确定当可为null的值为null时希望发生什么。默认情况下,可空整数公开一个属性,您可以使用它来确定为默认值,或者可以考虑使用NULL传播操作符来处理:

// This will use the expiration date if it exists, otherwise it will use 1
int month = m_instr.InstrumentDetails.ExpirationDate?.Month ?? 1;
另一个选项涉及设置初始值,并在使用前使用该方法更新该值:

int month = 1;
int.TryParse(m_instr.InstrumentDetails.ExpirationDate?.Month, out month);
考虑引发异常

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

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

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

假设
过期日期。
是您的
int?
,如果问题是是否存在
过期日期
,你不应该看看这是不是
null
?然后,您可以使用常规的
int
作为
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);
         }
    }

假设
ExpirationDate.
是您的
int?
s,如果问题是是否存在
ExpirationDate
,您不应该改为查看它是否为
null
?然后,您可以使用常规的
int
作为
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);
         }
    }

很可能
ExpirationDate.Month
的类型是
int?
,而不是
int
。没有
[mcve]
很难判断。(首先,我们不知道
仪器的类型是什么。)如果该值为
null
,您预计会发生什么?请提供
仪器的
仪器详细信息的定义。是的,到期日期。月份为int?,仪器为私有仪器m_instr=null;这些值是可选的吗?如果不是,则抛出异常
if(day.HasValue==false)抛出新ArgumentException()
other wise提供默认值,
day??1
很可能
到期日期。月份
的类型为
int?
,而不是
int
。没有
[mcve]
很难判断。(首先,我们不知道
仪器的类型是什么。)如果该值为
null
,您预计会发生什么?请提供
仪器的
仪器详细信息的定义。是的,到期日期。月份为int?,仪器为私有仪器m_instr=null;这些值是可选的吗?如果不是,则抛出异常
if(day.HasValue==false)抛出新ArgumentException()
other wise提供默认值,
day