【问题标题】:convert int to nullable int?将 int 转换为可为空的 int?
【发布时间】:2018-05-23 02:17:06
【问题描述】:

我需要知道如何将 int 转换为可为空的 int。但是,我不断收到错误消息“没有为类型‘System.Nullable`1[System.Int32]’和‘System.Int32’定义二元运算符 Equal。”任何解决方案。它需要是 Microsoft SQL Server 的可为空的 int 类型。

 somevalue = Expression.Constant(something.GetValue(some,null).To<Nullable<System.Int32>> ());

public static T To<T>(this object obj)
    {
        Type t = typeof(T);
        Type u = Nullable.GetUnderlyingType(t);

        if (u != null)
        {
            if (obj == null)
                return default(T);

            return (T)Convert.ChangeType(obj, u);
        }
        else
        {
            return (T)Convert.ChangeType(obj, t);
        }
    }'

【问题讨论】:

  • something.GetValue的返回类型是什么?看起来你要为应该更简单的事情做很多工作......
  • 错误是编译器错误还是运行时错误?我尝试使用各种输入来运行您的方法,但没有出现任何错误。如果您遇到运行时异常,请提供堆栈跟踪。
  • 返回类型应该是 int?。问题是我通过了一个int?这是数据库中的一个值,然后该函数返回一个 int,然后我需要将其转换回一个 int?这样做的原因是因为我正在尝试进行动态查询。还有 somevalue 是一个 var!不是一个整数?并且必须始终是 var,这不能改变,所以我不能像人们建议的那样投射。

标签: c# asp.net


【解决方案1】:

通常,您使用强制转换将int 转换为int?

int? myNullable = (int?) 15;
int myInt = (int) myNullable;

【讨论】:

    【解决方案2】:

    To 代码似乎是您在给定不可为空类型的值时尝试构造可空类型的Constant,但那根本不是解决此问题的正确方法。您尝试这样做的方式表明您对装箱值类型的工作方式存在误解。

    该错误消息表明您正在构建一个二元运算符表达式树节点,该节点具有一个可空 int 类型的表达式节点和一个 int 类型的表达式节点作为其操作数。那是不合法的;它们必须是 both 可为空的 int。您应该做的是将不可为空的 int 表达式树节点包装在 Convert 表达式树节点 中,将其转换为可为空的 int,然后将 that 传递给二元运算符表达式树节点构造函数。

    也就是说,这是错误的:

    var someIntExpr = Expression.Constant(123, typeof(int));
    var someNubIntExpr = Expression.Constant(null, typeof(int?));
    var badEq = Expression.Equal(someIntExpr, someNubIntExpr);
    

    这是对的:

    var goodEq = Expression.Equal(Expression.Convert(someIntExpr, typeof(int?)),  someNubIntExpr);
    

    那你为什么做错了?

    你有一个方法To&lt;T&gt;,它返回一个T。它正确地接收int 并返回等效的int?。那么呢?你将它传递给Expression.Constant,它将可以为空的int 装箱成一个装箱的int,然后从中生成一个常量。您认为存在盒装可为空值类型之类的东西,但实际上没有!可空值类型将绑定到空引用或绑定到不可空值类型。

    所以你也可以通过一开始就不要做任何这些疯狂的事情来解决你的问题。如果您手头有一个装箱的 int,并且您需要一个可为空类型的常量表达式树节点,只需提供类型

    Expression.Constant(someBoxedIntValue, typeof(int?))
    

    完成。所以:总结一下,你有两个解决方案:

    • 如果您手头有一个装箱的 int,请将它和您想要的可为空值类型传递给 Constant 工厂,或者
    • 如果您手头有一个 int 类型的表达式节点,则使用 Convert 表达式节点工厂,并将它和所需的类型传递给它。

    两者都会返回一个正确类型的表达式节点,以便与另一个可为空的 int 进行比较。

    【讨论】:

    • 您好,谢谢您的回复,我想您可能是对的。但我不知道如何在我当前的代码中实现这一点。你能举个例子吗 var somevalue = Expression.Constant(something.GetValue(some,null).To> ());我只需要更改此代码吗?
    • 你的天才!成功了!
    • @user2582770:我不是天才,但我是编写大部分代码的人。 :-) 很高兴你知道了。
    • 创建动态 linq 查询的最佳方法是什么?我对 lamda 等不太熟悉,所以我想知道您是否知道我可以在哪里学习创建动态 linq 查询。谢谢
    • 2022 年仍可在此处使用 .NET 6。谢谢,Eric!
    【解决方案3】:
    int test = 0; // set int
    
    int? num = test; // convert test to a nullable int
    
    num = null; // set num as null
    

    【讨论】:

      【解决方案4】:
      int i = 1;
      int? k;
      k = i as int?;
      

      像这样,您会将 i 这是一个 int 转换为一个可为空的 int ;)

      int?Nullable&lt;int&gt; 的缩写。

      【讨论】:

        【解决方案5】:

        像这样简单的东西不起作用吗?

        int i; 
        int? temp = int.TryParse(<your value>, out i) ? (int?)i : null;
        

        【讨论】:

          【解决方案6】:

          给你。可空原始解决方案的通用字符串。

          int? n = "  99 ".ToNullable<int>(); 
          
          /// <summary>
          /// Developed by Taylor Love
          /// </summary>
          public static class ToNullableStringExtension
          {
              /// <summary>
              /// <para>More convenient than using T.TryParse(string, out T). 
              /// Works with primitive types, structs, and enums.
              /// Tries to parse the string to an instance of the type specified.
              /// If the input cannot be parsed, null will be returned.
              /// </para>
              /// <para>
              /// If the value of the caller is null, null will be returned.
              /// So if you have "string s = null;" and then you try "s.ToNullable...",
              /// null will be returned. No null exception will be thrown. 
              /// </para>
              /// </summary>
              /// <typeparam name="T"></typeparam>
              /// <param name="p_self"></param>
              /// <returns></returns>
              public static T? ToNullable<T>(this string p_self) where T : struct
              {
                  if (!string.IsNullOrEmpty(p_self))
                  {
                      var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
                      if (converter.IsValid(p_self)) return (T)converter.ConvertFromString(p_self);
                      if (typeof(T).IsEnum) { T t; if (Enum.TryParse<T>(p_self, out t)) return t;}
                  }
          
                  return null;
              }
          

          https://github.com/Pangamma/PangammaUtilities-CSharp/tree/master/src/StringExtensions

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-25
            • 1970-01-01
            • 2014-10-20
            • 2014-01-29
            • 2019-06-18
            • 2020-07-03
            • 2012-01-07
            • 1970-01-01
            相关资源
            最近更新 更多