簡體   English   中英

顯式和隱式類型轉換有什么區別?

[英]What is the difference between explicit and implicit type casts?

你能解釋一下explicitimplicit類型轉換的區別嗎?

這有點棘手,因為 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)

這兩者都運行特定於上下文的自定義代碼。

美國總統和加拿大總統有什么區別?

由於沒有加拿大總統,這個問題很難回答。 正確的做法是反擊並要求澄清問題。 提問者所說的“加拿大總統”是指女王(正式的國家元首)、總督(可以否決法案)還是總理(實際上是執行官),還是其他什么? 沒有澄清就很難說。

即使澄清了,這也是一個模糊的問題。 您想了解哪些差異?

由於 C# 中沒有“隱式強制轉換”這樣的東西,因此很難回答您的問題。 在 C# 中,強制轉換是一個運算符。 所以我會反擊它。

您的意思是問“顯式轉換和隱式轉換有什么區別?” 或者您的意思是詢問強制轉換運算符的語義? 或者cast操作符和其他類型轉換操作符的區別? 或者編譯器可以“隱式”插入到您的代碼中的情況? (例如,foreach 循環和 += 運算符都可以隱式插入一個不可見的強制轉換。)

你能澄清這個問題嗎? 您要求比較哪兩件事,以及您對哪些差異感興趣?

您可以考慮閱讀 C# 規范的“轉換”一章。 很有可能您對轉換的任何問題都會在那里得到解答。

int i = 2;

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

顯式轉換

如果不能在沒有丟失信息的風險的情況下進行轉換,則它是顯式轉換。

例如 -

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 x = 0;
float y = 3.8f;

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

這告訴編譯器強制轉換是有意的,並且您知道小數部分將丟失。 編譯器不會抱怨。

隱式轉換:

int x = 0;
float y = 3.8f;

x += y; //Implicit cast

編譯器會抱怨,因為在將 float 轉換為 int 時小數部分會丟失。

簡單的搜索將在網絡中提供大量信息。
隱式和顯式類型的區別

來自MSDN 的明確 -

如果轉換操作可能導致異常或丟失信息,則應將其標記為顯式。 這可以防止編譯器以靜默方式調用轉換操作,並可能產生不可預見的后果。

來自MSDN 的隱式 -

如果保證轉換不會導致數據丟失

類型轉換:將一種數據類型轉換為另一種數據類型。 它可以通過兩種方式完成。

隱式類型轉換,顯式類型轉換

隱式類型轉換由編譯器在程序中遇到混合數據類型表達式時自行執行。 它也被稱為自動轉換,因為它是由編譯器在沒有程序員幫助的情況下完成的。 隱式轉換不需要轉換運算符。

例子:-

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) 是類型轉換運算符,具有要轉換的類型。

從一般的角度來看; 這是兩種類型的演員之間的差異:

隱式類型轉換由編譯器在程序中遇到混合數據類型表達式時自行執行。 它也被稱為自動轉換,因為它是由編譯器在沒有程序員幫助的情況下完成的。 隱式轉換不需要轉換運算符。

顯式類型轉換由程序員執行。 在這種類型轉換中,程序員告訴編譯器使用類型轉換運算符將一種數據類型轉換為另一種數據類型。 但是有一些信息丟失的風險是存在的,所以在做的時候需要小心。

你可以參考這篇文章了解更多詳情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM