我需要知道如何将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)
完成.所以:结束,你有两个解决方案:
Constant工厂,或者Convert表达式node factory,并将它和所需的类型传递给它.两者都会返回一个正确类型的表达式节点,以便与另一个可空的int进行比较.
Mic*_*ter 22
通常情况下,一个转换int的int?使用演员.
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)
| 归档时间: |
|
| 查看次数: |
52576 次 |
| 最近记录: |