【问题标题】:C# how to check if a variable of type object can be cast to a struct type?C#如何检查对象类型的变量是否可以转换为结构类型?
【发布时间】:2020-08-16 21:19:21
【问题描述】:

在 C# 中,如果我有一个 object 类型的变量,我如何检查是否可以将其转换为类型 T,这是一个值类型? as 运算符不起作用,因为 T 是一个值类型,而 o.GetType().Equals(typeof(T)) 只是检查 object 是否是 T 类型的装箱变量,但不检查它是否可以强制转换为 T。

【问题讨论】:

  • "...只检查 object 是否是 T 类型的装箱变量,但不检查它是否可以转换为 T。"对于结构,这两件事不是等价的吗?你能举一个T的例子吗,即o.GetType().Equals(typeof(T))是假的,但你可以把对象转换成T
  • @user1282931:不,装箱的double 不能转换为float,反之亦然。在 少数 种情况下,您可以转换为不同的类型(例如 uintint 或枚举),但一般来说,您只能取消装箱为原始装箱类型。
  • @user1282931 你能像if (o is double d)一样使用is运算符吗?
  • 嗯...不,您不能将盒装的 float 投射到 double。试试object o = 1f; double d = (double)o;。除非你的意思不同?
  • @V0ldek:哎呀 - 对于uint/int 的情况,我正在考虑数组。 (C# 编译器不允许您将 int[] 转换为 uint[],但 CLR 很乐意这样做。)它确实仍然适用于拆箱 int vs enum:gist.github.com/jskeet/bbe290432a665937be0a18841d4e1f2c

标签: c#


【解决方案1】:

试试这个

object obj = "wer";
var isCompatible = typeof(T).IsAssignableFrom(obj.GetType());

【讨论】:

    【解决方案2】:

    你可以试试这些:

    object obj = "wer";
    typeof(T).IsInstanceOfType(obj)
    

    阅读更多:https://docs.microsoft.com/en-us/dotnet/api/system.type.isinstanceoftype?view=netcore-3.1

    或者

    object obj = "wer";
    obj is T;
    

    阅读更多:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is

    或者

    object obj = "wer";
    typeof(T).IsAssignableFrom(obj.GetType())
    

    阅读更多:https://docs.microsoft.com/en-us/dotnet/api/system.type.isassignablefrom?view=netcore-3.1

    但是您需要注意IsAssignableFromIsInstanceOfTypeis 之间的区别。在这里阅读更多:

    https://stackoverflow.com/a/497001/1666800

    https://stackoverflow.com/a/15853224/1666800

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-14
      • 2011-06-07
      • 1970-01-01
      • 2011-10-25
      • 2011-01-08
      • 2020-09-02
      • 2011-09-26
      • 2013-08-01
      相关资源
      最近更新 更多