【问题标题】:What is the difference between explicit and implicit type casts?显式类型转换和隐式类型转换有什么区别?
【发布时间】:2009-10-18 07:51:09
【问题描述】:

您能解释一下explicitimplicit 类型转换之间的区别吗?

【问题讨论】:

标签: c#


【解决方案1】:

这有点棘手,因为 C# 中的“转换”语法实际上做了一系列不同的事情(转换、原始转换、定制转换等)

在隐式转换中,两者之间存在明显的保留引用转换:

List<int> l = new List<int>();
IList<int> il = l;

编译器可以通过静态分析证明这是安全的(List&lt;int&gt; 始终是 IList&lt;int&gt;

使用显式强制转换,要么你告诉编译器你知道的比它知道的多 - “请相信我,但无论如何都要检查”:

List<int> l = new List<int>();
IList<int> il = l;
List<int> l2 = (List<int>)il;

尽管这种转换是可能的,但编译器不会接受 all IList&lt;int&gt;s 实际上是 List&lt;int&gt; - 所以我们必须告诉它让它通过.


在隐式原始转换(由语言规范提供)中,通常假定存在安全、无风险、无损失(警告:请参阅 Jon 的评论)的转换:

int i = 1;
float f = i;

使用显式原始转换,转换可能可能丢失数据,或者不明显:

float f = 1;
int i = (int)f;

使用定制运营商,所有赌注都没有了,您必须查看文档。它可以是一个引用转换,也可以是任何东西。它可能遵循与原始转换类似的规则(例如:decimal),或者它可以随机执行任何操作:

XNamespace ns = "http://abc/def"; // implicit
XAttribute attrib = GetAttrib();
int i = (int)attrib; // explicit (extracts text from attrib value and
                     // parses to an int)

这两个都运行特定于上下文的自定义代码。

【讨论】:

  • 我认为“无损”是一种非常轻微的夸大其词。在 long to double 的情况下,您 可能 丢失信息。该规范谈到了失去精度而不是幅度,这对我来说听起来像是一种逃避。
  • 我碰巧查到的规范参考 - 6.1.2:“从 int、uint、long 或 ulong 到 float 以及从 long 或 ulong 到 double 的转换可能会导致精度损失,但绝不会导致幅度损失。其他隐式数字转换永远不会丢失任何信息。"
  • 您能解释一下什么是定制运营商吗?我在上面找不到任何东西。
【解决方案2】:

美国总统和加拿大总统有什么区别?

由于没有加拿大总统,因此很难回答这个问题。正确的做法是回击并要求澄清问题。提问者所说的“加拿大总统”是指女王(礼仪元首)、总督(可以否决法案)或总理(实际上是行政部门),还是其他什么?没有澄清就很难说。

即使经过澄清,这也是一个模糊的问题。您想了解哪些差异?

由于 C# 中没有“隐式强制转换”之类的东西,因此很难回答您的问题。在 C# 中,强制转换是一个运算符。所以我会推回去。

您的意思是要问“显式转换和隐式转换有什么区别?”或者您的意思是询问演员转换运算符的语义?或者强制转换运算符和其他类型转换运算符的区别?或者编译器可以将强制转换运算符“隐式”插入到您的代码中的情况? (例如,foreach 循环和 += 运算符都可以隐式插入不可见的强制转换。)

你能澄清一下这个问题吗?您要求比较哪两件事,您对哪些差异感兴趣?

您可以考虑阅读 C# 规范的“转换”一章。很有可能您对转化的任何问题都能在此处得到解答。

【讨论】:

  • 由于 C# 中没有“隐式强制转换”之类的东西,因此很难回答您的问题。在C#中,强制转换是一个操作符这样说对吗——使用强制转换操作符实现显式转换
  • 也在努力思考 - 说“隐式演员”有什么问题?如果转换是隐式的而不需要任何强制转换,难道不是可以说它是“隐式强制转换”吗?
【解决方案3】:
int i = 2;

float a = i;        // Implicit
float b = (float)i; // Explicit

【讨论】:

    【解决方案4】:

    显式转化

    如果不能在没有丢失信息的风险的情况下进行转换,那么它就是显式转换。

    例如——

    class ExplicitConversions
    {
        static void Main()
        {
            int x;
            double y = 6358.057;
            // Cast double to int.
            x = (int)y;
            System.Console.WriteLine(x);
        } 
    }
    

    隐式转换

    如果可以在没有丢失信息的风险的情况下进行转换,那么它就是隐式转换。不需要特殊语法,因为转换是类型安全的,不会丢失数据。

    例如——

    class ImplicitConversions
    {
        static void Main()
        {
            int x = 6714;
            double y;
            // Cast int to double.
            y = x;
            System.Console.WriteLine(y);
        } 
    }
    

    【讨论】:

    • 那么需要执行显式转换是错字吗?你的意思是不需要对吗?
    【解决方案5】:

    我认为post 解释得最好。

    【讨论】:

      【解决方案6】:

      显式转换:

      int x = 0;
      float y = 3.8f;
      
      x += (int) y; //Explicit cast.
      

      这告诉编译器强制转换是有意的,并且您知道小数部分会丢失。编译器不会抱怨。

      隐式转换:

      int x = 0;
      float y = 3.8f;
      
      x += y; //Implicit cast
      

      编译器会报错,因为在将浮点数转换为整数时,小数部分会丢失。

      【讨论】:

        【解决方案7】:
        【解决方案8】:

        一个简单的搜索就会在网上提供很多信息。
        difference between implicit and explicit type

        【讨论】:

          【解决方案9】:

          显式来自MSDN -

          如果转换操作可能导致异常或丢失信息, 你应该明确标记它。这可以防止编译器静默 在可能无法预料的情况下调用转换操作 后果。

          隐含来自MSDN -

          如果保证转换不会造成数据丢失

          【讨论】:

            【解决方案10】:

            类型转换:将一种数据类型转换为另一种数据类型。它可以通过两种方式完成。

            隐式类型转换显式类型转换

            当在程序中遇到混合数据类型表达式时,编译器会自行执行隐式类型转换。它也被称为自动转换,因为它是由编译器在没有程序员帮助的情况下完成的。隐式转换不需要转换运算符。

            示例:-

            int a=42;
            float b=a;
            

            这里 b 将包含 a 的类型转换值,因为在为 b 赋值时,编译器会将 a 的值类型转换为 float,然后将其分配给 b。

            显式类型转换由程序员执行。在这种类型转换中,程序员告诉编译器使用类型转换运算符将一种数据类型类型转换为另一种数据类型。但是有一些信息丢失的风险,所以在做的时候需要小心

            示例:-

            float a=42.12;
            int b=(int)a;
            

            在这里,我们将 a 的浮点值显式转换为 int,同时将其分配给 int b。 (int) 是要转换的类型的类型转换运算符。

            【讨论】:

              【解决方案11】:

              从总体上看;这是两种类型的演员之间的区别:

              当在程序中遇到混合数据类型表达式时,编译器会自行执行隐式类型转换。它也被称为自动转换,因为它是由编译器在没有程序员帮助的情况下完成的。隐式转换不需要转换运算符。

              显式类型转换由程序员执行。在这种类型转换中,程序员告诉编译器使用类型转换运算符将一种数据类型转换为另一种数据类型。但是有一些信息丢失的风险,所以在做的时候需要小心。

              您可以参考This article了解更多详情。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-09-10
                • 2013-12-27
                • 2011-07-01
                • 1970-01-01
                • 2011-05-02
                • 2011-01-21
                • 2013-07-09
                相关资源
                最近更新 更多