将int转换为nullable int?

use*_*770 20 c# asp.net

我需要知道如何将int转换为可以为null的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);
        }
    }'
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 24

当给定非可空类型的值时,该To代码似乎是您尝试构造Constant可空类型,但这根本不是正确的方法.您尝试这样做的方式表明您对盒装值类型的工作方式存在误解.

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

也就是说,这是错误的:

var someIntExpr = Expression.Constant(123, typeof(int));
var someNubIntExpr = Expression.Constant(null, typeof(int?));
var badEq = Expression.Equal(someIntExpr, someNubIntExpr);
Run Code Online (Sandbox Code Playgroud)

这是正确的:

var goodEq = Expression.Equal(Expression.Convert(someIntExpr, typeof(int?)),  someNubIntExpr);
Run Code Online (Sandbox Code Playgroud)

那你为什么做错了?

你有一个方法To<T>返回一个T.它正确地接受int并返回等价​​物int?.那么什么呢?你将它传递给Expression.Constant,将可以为空的int 打包成一个盒装的int,然后从中取出一个常量.您认为存在盒装可空值类型这样的东西,但没有!可空值的类型框可以是空引用,也可以是盒装非可空值类型.

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

Expression.Constant(someBoxedIntValue, typeof(int?))
Run Code Online (Sandbox Code Playgroud)

完成.所以:结束,你有两个解决方案:

  • 如果您手头有一个盒装的int,请将它和您想要的可空值类型传递给Constant工厂,或者
  • 如果你手头有一个int类型的表达式节点,那么使用Convert表达式node factory,并将它和所需的类型传递给它.

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

  • @ user2582770:我不是天才,但我是编写该代码的重要部分的人.:-) 恭喜你弄明白了. (4认同)

Mic*_*ter 22

通常情况下,一个转换intint?使用演员.

int? myNullable = (int?) 15;
int myInt = (int) myNullable;
Run Code Online (Sandbox Code Playgroud)


小智 5

int test = 0; // set int

int? num = test; // convert test to a nullable int

num = null; // set num as null
Run Code Online (Sandbox Code Playgroud)