Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显式类型转换和隐式类型转换之间有什么区别?_C# - Fatal编程技术网

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

C# 显式类型转换和隐式类型转换之间有什么区别?,c#,C#,你能解释一下显式类型转换和隐式类型转换之间的区别吗?这有点棘手,因为C中的“cast”语法实际上做了一系列不同的事情(cast、原语转换、定制转换等) 在隐式转换中,两者之间存在一个明显的保留引用的转换: List<int> l = new List<int>(); IList<int> il = l; 使用显式原语转换时,转换可能会丢失数据,或者不明显: float f = 1; int i = (int)f; 对于定制运营商,所有赌注都没有了,您必须

你能解释一下显式类型转换和隐式类型转换之间的区别吗?

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

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

List<int> l = new List<int>();
IList<int> il = l;
使用显式原语转换时,转换可能会丢失数据,或者不明显:

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)
它们都运行特定于上下文的自定义代码。

int i = 2;

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

我认为这是最好的解释。

显性演员阵容:

int x = 0;
float y = 3.8f;

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

x += y; //Implicit cast
这会告诉编译器强制转换是有意的,并且您知道小数部分将丢失。编译器不会抱怨的

隐式转换:

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时小数部分会丢失。

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

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

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

因为C#中没有“隐式演员阵容”这样的东西,所以很难回答你的问题。在C#中,casting是一个操作符。所以我会把它推回去

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

你能澄清这个问题吗?你想比较哪两件事?你对哪两种不同感兴趣


你可以考虑阅读C语言规范中的“转换”章节。很有可能你关于转换的任何问题都会在那里得到解答。

一个简单的搜索将在网上提供大量信息。

显式转换

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

例如—

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);
    } 
}
隐式转换

如果可以在不丢失信息的情况下进行转换,则这是一种隐式转换。不需要特殊语法,因为转换是类型安全的,并且不会丢失任何数据

例如—

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);
    } 
}
明确来自-

如果转换操作可能导致异常或丢失信息, 您应该将其标记为显式。这可以防止编译器以静默方式运行 调用转换操作时可能出现不可预见的错误 后果

隐含于-


如果保证转换不会导致数据丢失,类型转换:
将一种数据类型转换为另一种数据类型。这可以通过两种方式实现

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

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

示例:-

int a=42;
float b=a;
float a=42.12;
int b=(int)a;
这里b将包含a的类型转换值,因为当给b赋值时,编译器将a的值类型转换为浮点值,然后将其赋值给b

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

示例:-

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

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

也请查看。。许多的古鲁的。。回答/评论。。这问题。。必须离开很快。我认为“无损”是一个非常轻微的夸大。在长时间翻倍的情况下,您可能会丢失信息。规范中提到的是精度损失,而不是量级损失,这听起来像是在逃避责任。规范参考,正如我碰巧查到的-6.1.2:“从int、uint、long或ulong到float以及从long或ulong到double的转换可能会导致精度损失,但永远不会导致数量级损失。其他隐式数字转换从不丢失任何信息。“你能澄清什么是定制运算符吗?我在上面找不到任何东西。因为没有所谓的“隐式转换”“在C#中,很难回答你的问题。在C#中,casting是一个操作符。这样说正确吗?使用cast操作符可以实现显式转换。同样,仔细想想,“隐式cast”有什么不对?如果转换是隐式的而不需要任何强制转换,那么可以说它是“隐式强制转换”?那么需要执行的显式转换是打字错误吗?你的意思是不必是对的?