前言
今天在研究公司專案框架的時候看到了下面的用法,public static implicit operator jsondata(in程式設計客棧t data);。貌似很久沒用過這種隱式轉換的寫法了,因此重新溫習一下c#中轉換相關的知識。
explicit 和 implicit 屬於轉換運算子,如用這兩者可以讓我們自定義的型別支援相互交換
explicti 表示顯式轉換,如從程式設計客棧 a -> b 必須進行強制型別轉換(b = (b)a)
implicit 表示隱式轉換,如從 b -> a 只需直接賦值(a = b)
implicit
implicit 關鍵字用於宣告隱式的使用者自定義的型別轉換運算子。 如果可以確保轉換過程不會造成資料丟失,則可使用該關鍵字在使用者定義型別和其他型別之間進行隱式轉換。
使用隱式轉換操作符之後,在編譯時會跳過異常檢查,所以隱式轉換運算子應當從不引發異常並且從不丟失資訊,否則在執行時會出現一些意想不到的問題。
示例class digit
public double val;
// ...other members
// user-defined conversion from digit to double
public static implicit operator double(digit d)
// user-defined conversion from double to digit
public static implicit operator digit(double d) }
class program
dig2 = ", num, dig2.val);
console.readline();
}}隱式轉換可以通過消除不必要的強制轉換來提高源**的可讀性。 但是,因為隱式轉換不需要程式設計師將一種型別顯式強制轉換為另一種型別,所以使用隱式轉換時必須格外小心,以免出現意外結果。 一般情況下,隱式轉換運算子應當從不引發異常並且從不丟失資訊,以便可以在程式設計師不知曉的情況下安全使用它們。 如果轉換運算子不能滿足那些條件,則應將其標記為 explicit。 有關詳細資訊,請參閱使用轉換運算子。
explicit顯示轉換
explicit 關鍵字宣告必須通過顯示的呼叫使用者定義的型別轉換運算子來進行轉換。
以下示例定義從 fahrenheit 類轉換為 celsius 類的運算子。 必須在 fahrenheit 類或 celsius 類中定義運算子:
public static explicit operator celsius(fahrenheit fahr)
如下所示,呼叫使用者定義的轉換運算子來強制轉換:
fahrenheit fahr = new fahrenheit(100.0f);
console.write($" fahrenheit");
celsius c = (celsius)fahr;
此轉換運算子從源型別轉換為目標型別。 源型別提供轉換運算子。 不同於隱式轉換,顯式轉換運算子必須通過轉換的方式來呼叫。 如果轉換操作會導致異常或丟失資訊,則應將其標記為 explicit。 這可阻止編譯器靜默呼叫可能產生意外後果的轉換操作。
省略轉換將導致編譯時錯誤 cs0266。
有關詳細資訊,請參閱使用轉換運算子。
示例下面的示例提供了 fahrenheit 和 celsius 類,其中每個類均提供轉換為其他類的顯式轉換運算子。
class celsius
public float degrees
public static explicit operator fahrenheit(celsius c) }
class fahrenheit
public float degrees
public static explicit operator celsius(fahrenheit fahr) }
class mainclass
fahrenheit");
celsius c = (celsius)fahr;
console.write($" = celsius");
fahrenheit fahr2 = (fahrenheit)c;
console.writeline($" = fahrenheit"); }}
// 輸出:
// 100 fahrenheit = 37.77778 celsius = 100 fahrenheit
示例下面的示例定義結構 digit,它表示單程式設計客棧個的十進位制數字。 將運算子定義為從 byte 到 digit 的轉換,但由於並非所有位元組都可轉換為 digit,因此該轉換應該應用顯式轉換。
struct digit
this.value = value;
} // 定義從byte到digit的顯示轉換 explicit operator:
public static explicit operator digit(byte b) }
class explicittest
catch (exception e)
捕獲到一成.", e);
} }}/*
輸出:轉換已完成
*/參考資料
總結本文標題: c#中explicit與implicit的深入理解
本文位址: /ruanjian/csharp/259997.html
C 中explicit技術探索
c 中 explicit 技術探索 c 程式語言中有很多比較重要的關鍵字在實際程式設計中起著非常重要的作用。我們今天為大家介紹的c explicit關鍵字就是其中乙個應用比較頻繁的關鍵字。按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下面所...
C 中 explicit的用法
explicit 是避免建構函式的引數自動轉換為類物件的識別符號 cpp view plain copy include using namespace std class a intmain 上面的 編譯不成功,原因是當顯式地定義了乙個帶乙個引數的建構函式 帶explicit 必須要顯示地呼叫建構...
C 中 explicit顯示轉換
explicit 是避免建構函式的引數自動轉換為類物件的識別符號 cpp view plain copy include using namespace std class a intmain 上面的 編譯不成功,原因是當顯式地定義了乙個帶乙個引數的建構函式 帶explicit 必須要顯示地呼叫建構...