如何在c#中测试变量是否是值类型?

本文关键字:是否是 类型 变量 测试 | 更新日期: 2023-09-27 18:05:19

我有几个地方,我有一个泛型类型参数,不限于类(或结构),当我试图比较该类型的变量与null, Resharper强调它,抱怨我可能比较值类型与null(一个有效的反对,可以肯定)。是否有一种可接受的方法来检查变量是否为值类型,然后再与null进行比较?

例如:

public TObject MyProperty { get; set; }
...
private void SomeMethod()
{
    if(MyProperty == null) //Warning here
    {
       ...
    }
}

我一直在做if(!(MyProperty is ValueType) && MyProperty)——这是有效的吗?它不会去掉警告,但这并不一定意味着什么。

如何在c#中测试变量是否是值类型?

如果它是一个值类型,你想做什么?有时我会这样做:

public void DoStuff<T> (T variable)
{
    if(variable == default(T))
        ...  // true if null or 0 in the case of a value type
}

或:

if( typeof(T).IsValueType )

您可以使用反射,但它很慢,应该避免使用:

bool isValueType = typeof(TObject).IsValueType;
你的泛型方法真的需要传递引用类型和值类型作为它的类型参数吗?

你可以直接比较类型:

if (MyProperty.GetType() == typeof(...))
{
}

您得到一个警告,因为MyProperty没有分配给。

public static bool IsNull<T>(T t)
{
    return ((Object)t == null);
}