[英]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.