繁体   English   中英

如何确定可以为空的值类型

[英]how to decide a nullable value type

void Main()
{

   test((int?)null);

   test((bool?)null);

   test((DateTime?)null);

}

void test(object p)

{

   //**How to get the type of parameter p**
}

也许这可以帮助:

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值仅对使编译器选择 function 的特定重载有用。 由于您在这里没有重载 function ,因此在所有三种情况下都会调用相同的 function 。 如果没有实际传递一个值,您所有的 function 将看到的是一个null值,它无法确定调用者将null值转换为的类型。

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

var type = p.GetType();

但是,如果您试图以这种方式找出参数的类型,则通常表明您做错了。 您可能想查看重载方法或 generics 代替。

编辑

正如一位精明的评论者指出的那样, null没有与之关联的类型。 例如:

((int?)null) is int?

上面的表达式将产生false 但是,使用 generics,您可以确定编译器期望 object 具有什么类型:

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

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

您的意思是 class 名称吗? 那会得到它:

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

或者只有类型:

p.GetType();

像这样

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

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

除了 GetType,您还可以像这样使用is 关键字

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类型。

一种优化是直接使用as 关键字,如下所示:

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM