簡體   English   中英

隱式運算符

[英]implicit operator

我剛剛看到它在最近的一個答案中使用:

public static implicit operator bool(Savepoint sp)
{
    return sp != null;
}

為什么這里需要隱含這個詞,它是什么意思?

隱式意味着轉換不需要在您的代碼中進行強制轉換。

你現在可以這樣做:

Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}

而不是必須這樣做:

Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}

為什么這是一個有用的區別的一個例子是數字類型。 存在從“較小”​​類型到“較大”類型的隱式轉換,例如:

float f = 6.5;
double d = f; // implicit conversion

但是將較大的類型轉換為較小的類型可能很危險,因此只有顯式轉換,迫使用戶澄清他確實打算執行有問題的操作:

long l = 20;
// short s = l;
short s = (short)l;  // explicit conversion

這看起來像是誤用了隱式運算符。 我不知道 Savepoint 類的作用,但將其轉換為布爾值似乎不合邏輯。 隱式運算符使您能夠通過簡單地評估引用來檢查保存點引用是否為空:

if (point) {

代替:

if (point != null) {

如果以這種方式使用,就會隱藏代碼實際執行的操作,這與 C# 的幾乎所有內容背道而馳。

只是為了補充 mquander 的答案。

來自 C# 3.0 語言規范:

包含implicit關鍵字的轉換運算符聲明引入了用戶定義的隱式轉換。 隱式轉換可以在多種情況下發生,包括函數成員調用、強制轉換表達式和賦值。

(第 10.10.3 節)

轉換運算符從一種類型轉換為另一種類型。 隱式意味着您不必在代碼中鍵入顯式轉換才能發生轉換,顯式要求調用代碼中的轉換。

當您確定轉換不會丟失任何數據時,您可以使用隱式轉換運算符。 例如,使用加寬強制轉換(int -> long,float -> double)。 當某些狀態將丟失或您不希望編譯器通過在各處插入轉換來自動搞砸客戶端代碼時,將使用顯式轉換運算符。

像您這樣的轉換真的會造成嚴重破壞,因為不建議執行此特定轉換。

您需要指定“隱式”,因為也有顯式運算符。

這意味着 Boolean 和 Savepoint 之間的轉換可以隱式完成,例如 = hidden。

Savepoint s = new Savepoint();
bool b = s;

顯式轉換,例如明顯的,可以通過這種方式完成:

 Savepoint s = new Savepoint();
 bool b = (bool)s;

當沒有可能的數據丟失時,通常使用隱式轉換,即Int16 (short)Int32 (int) 但如果可能,您需要使用顯式轉換來“同意”它。

例如,在您的情況下,如果Savepoint只是一個

struct Savepoint
{
  public bool data;
}

您可以使用隱式轉換,因為不會丟失數據:

Savepoint s = new Savepoint();
s.data = true;
bool b = s;

否則我建議您定義顯式運算符!

暫無
暫無

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

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