如何决定一个可以为null的值类型

本文关键字:null 类型 何决定 决定 一个 | 更新日期: 2023-09-27 17:58:30

void Main()
{
   test((int?)null);
   test((bool?)null);
   test((DateTime?)null);
}
void test(object p)
{
   //**How to get the type of parameter p**
}

如何决定一个可以为null的值类型

也许这会有所帮助:

void Main()
{
   test<int>(null);
   test<bool>(null);
   test<DateTime>(null);
}
void test<T>(Nullable<T> p)
where T : struct, new()
{
   var typeOfT = typeof(T);
}

您无法获取类型,因为您没有传递任何值。这三个调用之间没有区别。

强制转换null值只对编译器选择函数的特定重载有用。由于这里没有重载函数,因此在这三种情况下都调用相同的函数。如果不实际传递值,函数将只看到一个null值,它无法确定调用方将该null值强制转换为的类型。

.NET中的每个对象都有一个GetType()方法:

var type = p.GetType();

然而,如果你试图用这种方式计算参数的类型,这通常是你做错了什么的迹象。您可能需要研究重载的方法或泛型。

编辑

正如一位精明的评论者所指出的,null没有与之相关的类型

((int?)null) is int?

上述表达式将产生false。然而,使用泛型,您可以计算出编译器期望对象具有的类型:

void Test<T>(T p)
{
    Type type = typeof(T);
    ...
}

同样,我认为这种策略通常是可以避免的,如果你能解释你为什么需要它,我们可能会帮你更多。

你是指类名吗?那就可以了:

  if(p != null)
  {
      p.GetType().FullName.ToString();
  }

或者只有类型:

p.GetType();

像这个

If p IsNot nothing then
    GetType(p).GetGenericArguments()(0)
End If

(我假设您正在寻找泛型类型,因为获取对象本身的类型非常简单)

除了GetType,您还可以使用is关键字,比如so:

void test(object p) {
    if (p is int?) {
        // p is an int?
        int? i = p as int?;
    }
    else if (p is bool?) {
        // p is an bool?
        bool? b = p as bool?;
    }
}

如果p为null,则它可以是int?bool?,或者任何objectNullable类型。

一个优化是直接用作关键字,如下所示:

void test(object p) {
    if (p == null)
        return; // Could be anything
    int? i = p as int?;
    if (i != null) {
        // p is an int?
        return;
    }
    bool? b = p as bool?;
    if (b != null) {
        // p is an bool?
        return;
    }
}