亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C#
烙印99 2021-12-25 16:29:37
我有一個名為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 };}問題是隱式運算符必須是靜態的,這就是為什么在轉換過程中創建了我的類的新實例的原因。結果,我丟失了位于“舊”實例中的所有信息。有沒有辦法解決這個問題?我希望將浮點值應用于現有實例,而不是完全替換它。
查看完整描述

3 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

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


查看完整回答
反對 回復 2021-12-25
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

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


// Constructor

public FloatPlugIn(float p)

{

    Default = p;

}

用法:


float y = 123;

FloatPlugIn x = new FloatPlugIn(y);


查看完整回答
反對 回復 2021-12-25
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

賦值運算符的語義需要這種行為。實際上:


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


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


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


如果您想要一個加法(在您的情況下意味著任何特定的意義),請考慮覆蓋加法+運算符,這反過來又會影響加法賦值+=運算符。但是,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。否則,就地修改x實際上將是一個令人討厭的副作用,任何其他開發人員都完全出乎意料。請注意,如果性能(避免動態內存分配)是一個問題,請考慮使用structs。


查看完整回答
反對 回復 2021-12-25
  • 3 回答
  • 0 關注
  • 136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號