簡體   English   中英

C#編譯器如何保證轉換成功?

[英]How does the C# compiler guarantee conversion success?

我正在Nutshell第7版中學習C#7.0。 我無法理解的部分文字(第24和25頁)

“當以下兩種情況都成立時,允許隱式轉換:

1)編譯器可以保證它們總能成功。

2)轉換中不會丟失任何信息。 (一個小小的警告是,當轉換為double時,非常大的long值會丟失一些精度)

相反,如果滿足以下條件之一,則需要顯式轉換:

1)編譯器無法保證它們始終會成功。

2)轉換過程中可能會丟失信息。“

如果編譯器可以確定>轉換將始終失敗,則禁止這兩種轉換“

你能給我一些編譯器無法保證轉換的例子嗎?

到目前為止,答案都集中在價值類型上。

對於引用類型,有基類,派生類和接口轉換。

class A  { }       // base class
class B : A { }    // B is-an A 
class C : A { }    // C is-an A 

B b = new B(); // instance of B 
A a = b;       // ok, conversion to base class can't fail because B is an A
C c = (C) a;   // but conversion to derived could fail, a could be a B 

數據類型向上轉換存在隱式轉換,例如short to intint to long 另一個例子是int to floatdouble 這些數據類型總是可以轉換為更大的對應數據類型。

反過來說不是這樣: double不能(總是)轉換為int long並不總是適合intshort

如果您在運行時對類型進行假設,則編譯器無法保證轉換的示例。 一個非常寬松的例子可能是這個

public int Add(object a, object b)
{
    return ((int)a) + ((int)b);
}

在這里,您假設您將在運行時傳遞一個int,無論出於何種原因您丟失了類型安全性並且您正在使用對象。 編譯器在編譯時沒有也無法知道這一點,因此你需要顯式轉換。

這是一個極端的例子,但希望它能為你清理一下

暫無
暫無

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

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