【问题标题】:Difference between Object type casting (as / (int)) in C# [duplicate]C#中对象类型转换(如/(int))之间的区别[重复]
【发布时间】:2011-11-15 15:26:31
【问题描述】:

可能重复:
What is the difference between the following casts in c#?

在处理 C# 时,她正在做类型转换,那时我有一个疑问:-

“as vs. (int)/(string)/... Soon”的对象类型转换有什么区别?

示例:

int a = (int) value;

VS.

int a = value as int;

string a = (string) value;

VS.

string a = value as string;

很快……

谁能详细解释一下?

提前致谢。

【问题讨论】:

标签: c# casting


【解决方案1】:

From msdn:

as 运算符用于执行某些类型的转换 在兼容的引用或可为空的类型之间。

备注:

as 运算符类似于强制转换操作。但是,如果转换 不可能,因为返回 null 而不是引发异常。 考虑以下表达式:

expression as type

除了表达式为 只评估了一次。

expression is type ? (type)expression : (type)null

请注意,as 运算符只执行转换为引用或 可空类型和装箱转换。 as 运算符无法执行 其他转换,例如用户定义的转换,应该 而是使用强制转换表达式来执行。

【讨论】:

    【解决方案2】:

    prefix- 和 as-casting 之间的主要区别在于转换失败时会发生什么。例如,想象一下,g 实际上是 AnotherSpecificType 的一个实例,它不是 SpecificType 的子类。在这种情况下,前缀转换会引发异常——但是,当转换失败时, as-cast 会返回 null,从而让程序继续执行。

    看看这篇文章:

    https://sites.google.com/site/gmamaladze/projects/short-articles/prefix-casting-versus-as-casting-in-c

    【讨论】:

      【解决方案3】:

      您不能将 as 用于非可空值类型,您只能将 as 用于可空值类型。我的意思是下面的行会给你一个构建错误/

      int a = value as int;
      

      无论如何,如果强制转换无效, as 将返回 null。我们通常使用它。

      Class1 c1 = value as Class1;
      if (c1 != null)
      {
          //do your logic.
      }
      

      【讨论】:

      • 您不能将as 用于不可为空 值类型。您可以将其用于可为空的,例如int? y = x as int?;
      • 我在反驳你。你的第一句话是不正确的,正如我的评论所指出的那样。
      • 更好,虽然还没有想象的那么清晰。 (我的评论是在您原来句子的上下文中。)
      【解决方案4】:

      使用 as 运算符与 C# 中的强制转换在三个重要方面有所不同:

      • 当您尝试转换的变量不是请求的类型或不在其继承链中时,它返回 null,而不是引发异常。
      • 它只能应用于转换为引用类型的引用类型变量。
      • 使用 as 不会执行用户定义的转换,例如隐式或显式转换运算符,而强制转换语法将执行此操作。

      【讨论】:

      • 如另一条评论所述,它也可以应用于可为空的值类型。
      【解决方案5】:

      如果您尝试在value 类型上转换为as,例如int a = value as int;,您将得到InvalidCastException。值类型必须转换为 (int) intValue

      如果您正在考虑使用任何reference 类型。您可以使用as,其中铸造失败将返回null。你可以使用像(string) value这样的直接转换,如果转换失败,这里会得到一个exception

      【讨论】:

        猜你喜欢
        • 2014-05-30
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 2012-07-28
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多