C# 可为空,请检查默认值
我正在尝试在使用大量反射的环境中创建一个扩展方法 方法的目的是重新创建默认值在运行时所做的操作 除了那些可为空的类型之外,它对所有类型都很好。甚至?-类型工作正常 我不知道如何才能知道,分配给对象变量的值是否为可空值,而不是常规值类型 在这种情况下,Nullable.GetUnderlyngType方法返回null,但适用于?-类型 我们知道defaultNullable==null。 我的扩展方法在为Nullable赋值0时产生错误的结果,因为0==defaultint 简而言之,我希望你明白我在这里要解释的: -如何确定随机对象是否为可空对象而不是int 该方法看起来像这样,为了简单起见,删除了任何缓存 我从这里取了零件C# 可为空,请检查默认值,c#,nullable,C#,Nullable,我正在尝试在使用大量反射的环境中创建一个扩展方法 方法的目的是重新创建默认值在运行时所做的操作 除了那些可为空的类型之外,它对所有类型都很好。甚至?-类型工作正常 我不知道如何才能知道,分配给对象变量的值是否为可空值,而不是常规值类型 在这种情况下,Nullable.GetUnderlyngType方法返回null,但适用于?-类型 我们知道defaultNullable==null。 我的扩展方法在为Nullable赋值0时产生错误的结果,因为0==defaultint 简而言之,我希望你明白
更清楚地说,我不能使用泛型材料…您不能这样做,因为当您调用该方法时,可为null的结构被装箱为object,并变成null或Int32值。这在前面的回答中有解释:
如果在调用此方法的地方将变量类型化为对象,我认为您无法获得所需的信息-它已经装箱。您不能这样做,因为当您调用此方法时,可空结构被装箱为对象,并变为null或Int32值。这在前面的回答中有解释:
如果在调用此方法的位置将变量类型化为对象,我认为您无法获得所需的信息-它已经装箱。当可为空的类型装箱到对象时,它可为空的事实将丢失:它要么变为纯旧int,要么变为纯旧null。如果对象已存储为类型对象,则无法恢复此状态。如果将可为空的类型装箱到对象,则该类型可为空的事实将丢失:它将变为纯旧int或纯旧null。如果您的对象已存储为类型对象,则无法从以下位置恢复。: 发件人:
似乎可以通过执行以下操作来确定类型是否可为null:
public static bool IsDefault<T>( this T obj )
{
var t = typeof( T );
var isNullable = t.IsGenericType && t.GetGenericTypeDefinition() == typeof( Nullable<> );
// ...
}
但是,您的方法必须是泛型的,这样才能起作用。似乎可以通过执行以下操作来确定类型是否可以为null:
public static bool IsDefault<T>( this T obj )
{
var t = typeof( T );
var isNullable = t.IsGenericType && t.GetGenericTypeDefinition() == typeof( Nullable<> );
// ...
}
但是,您的方法必须是泛型的,才能正常工作。同样,没有泛型。也不确定trollingAh是否错过了。呵呵,不,stackoverflow自己找到了我的gravatar,我一直懒得去改变它。再一次,没有泛型。也不确定trollingAh是否错过了。呵呵,不,stackoverflow自己找到了我的gravatar,我一直懒得去更改它。@CSharpie我建议根据哪个答案更好来选择-在这种情况下,我同意这是driis的-不是基于一个小时差。@CSharpie我建议根据哪个答案更好来选择-在这种情况下,我同意这是driis的-不是基于一个小的时间差。实际上我的代码不工作,因为参数将其装箱到一个对象中。不是你说的原因。事实上,我的代码不工作,因为参数将其装箱到一个对象中。不是你说的原因。
public static bool IsDefault<T>( this T obj )
{
var t = typeof( T );
var isNullable = t.IsGenericType && t.GetGenericTypeDefinition() == typeof( Nullable<> );
// ...
}