显式和隐式类型转换之间有什么区别?

时间:2009-10-18 07:51:10

标签: c#

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

11 个答案:

答案 0 :(得分:50)

这有点棘手,因为C#中的“强制转换”语法实际上会执行一系列不同的事物(强制转换,原始转换,定制转换等)

在隐式演员表中,两者之间存在明显的参考保留转换:

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

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

通过明确的演员表示,你要么告诉编译器你知道的更多 - “请相信我,但无论如何都要检查”:

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

虽然此演员阵容可能,但编译器不接受所有 IList<int>实际上List<int> - 所以我们必须告诉它让它通过。


在隐式原始转换中(由语言规范提供),通常假设存在安全,无风险,无损(警告:见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)

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

答案 1 :(得分:18)

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

由于没有加拿大总统,很难回答这个问题。正确的做法是推迟并要求澄清问题。对于“加拿大总统”,提问者是指女王(礼仪国家元首),总督(可以否决票据)还是总理(实际上是行政人员)或其他什么?很难说没有澄清。

即使澄清,这也是一个模糊的问题。你想知道什么不同?

由于C#中没有“隐式演员”,所以很难回答你的问题。在C#中,铸造是一个操作员。所以我会推迟它。

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

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

您可以考虑阅读C#规范的“转换”一章。如果您对转换有任何疑问,可以在那里得到解答。

答案 2 :(得分:9)

int i = 2;

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

答案 3 :(得分:3)

明确的转化次数

如果无法在没有丢失信息风险的情况下进行转换,那么这是一种明确的转换。

例如 -

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

答案 4 :(得分:2)

答案 5 :(得分:2)

我认为这post最能解释。

答案 6 :(得分:2)

明确演员:

int x = 0;
float y = 3.8f;

x += (int) y; //Explicit cast.

这告诉编译器演员是故意的,并且你知道小数部分会丢失。编译器不会抱怨。

隐性演员:

int x = 0;
float y = 3.8f;

x += y; //Implicit cast

编译器会抱怨因为将float转换为int时会丢失小数部分。

答案 7 :(得分:1)

简单的搜索将在网络中提供大量信息 difference between implicit and explicit type

答案 8 :(得分:0)

MSDN -

明确指出
  

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

隐含于MSDN -

如果保证转换不会导致数据丢失

答案 9 :(得分:0)

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

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

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

示例:-

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)是类型转换运算符,具有您要转换的类型。

答案 10 :(得分:-2)

class implicit{
   public void implicit(){
      int x = 100;
      float y = 1.2f;

      y = x; // Implicit Conversion

      System.out.println(y);
   }
}

class explicit{
   public void explicit(){
      int x = 100;
      float y = 1.2f;

      x = (int)y; // Explicit Conversion

      System.out.println(x);
   }
}