[英]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 int
或int
to long
。 另一個例子是int
to float
或double
。 這些數據類型總是可以轉換為更大的對應數據類型。
反過來說不是這樣: double
不能(總是)轉換為int
。 long
並不總是適合int
或short
。
如果您在運行時對類型進行假設,則編譯器無法保證轉換的示例。 一個非常寬松的例子可能是這個
public int Add(object a, object b)
{
return ((int)a) + ((int)b);
}
在這里,您假設您將在運行時傳遞一個int,無論出於何種原因您丟失了類型安全性並且您正在使用對象。 編譯器在編譯時沒有也無法知道這一點,因此你需要顯式轉換。
這是一個極端的例子,但希望它能為你清理一下
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.