簡體   English   中英

為什么隱式運算符必須是靜態的?

[英]Why implicit operator has to be static?

我有一個名為FloatPlugIn的類。 我希望用戶能夠做類似的事情

FloatPlugIn x = new FloatPlugIn();
x.Minimum = -100;
x.Maximum = 100;

float y = 123;
x = y;

這就是為什么我決定向班級添加implicit operator原因

public static implicit operator FloatPlugIn(float p)
{
    return new FloatPlugIn() { Default = p };
}

問題在於隱式運算符必須是靜態的,這就是為什么在轉換期間創建類的新實例的原因。 結果,我失去了位於“舊”實例內部的所有信息。

有辦法解決嗎? 我希望將float值應用於現有實例,而不是完全替換它。

我認為您不了解轉換的作用-它不是強制轉換-它必須創建一個新實例。 如果僅更新現有實例,則使其變為非靜態是有意義的。

我認為在這種情況下最好使用x.Default = y; 或者,如果您創建一個采用以下浮點數的構造函數:

// Constructor
public FloatPlugIn(float p)
{
    Default = p;
}

用法:

float y = 123;
FloatPlugIn x = new FloatPlugIn(y);

賦值運算符的語義要求該行為。 事實上:

賦值運算符(=)將其右操作數的值存儲在由其左操作數表示的存儲位置,屬性或索引器中,並返回該值作為其結果。 操作數必須具有相同的類型(或右側操作數必須隱式轉換為左側操作數的類型)。

隱式轉換運算符的目的不是修改目標值-請注意,可能沒有任何此類目標值,例如,將值傳遞給方法的參數的情況。

我希望將float值添加到現有實例,而不是完全替換它。

如果您想要加法 (在您的情況下,意味着什么),請考慮覆蓋加法+運算符,這反過來會影響加法賦值+=運算符 但是,無論如何您都不會消除新FloatPlugIn實例的創建。

考慮您將在FloatPlugIn使用以下方法,該方法將修改現有實例:

public void Add(float f)
{
    // do whatever 'addition' means in your case
}

然后+運算符應該像這樣工作:

public static FloatPlugIn operator +(FloatPlugIn a, float b)
{
    FloatPlugIn result = a.Clone(); // here Clone() denotes any custom method that creates a copy of that instance
    result.Add(b);
    return b;
}

在您的代碼中,以下內容將起作用:

FloatPlugIn x = new FloatPlugIn();
x.Minimum = -100;
x.Maximum = 100;

float y = 123;
x += y; // a new instance is created, but the 'addition' logic is preserved

同樣,在將值傳遞給方法調用的情況下,同樣可以直觀地工作:

ProcessMyFloatPlugin(x + 123.0f);

您可以看到,由於操作員的FloatPlugIn ,創建FloatPlugIn的新實例是一個非常好的主意 否則,實際上x修改將是討厭的副作用,任何其他開發人員都完全無法預料。 請注意,如果需要考慮性能(避免動態內存分配),請考慮使用struct

暫無
暫無

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

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