为了账号安全,请及时绑定邮箱和手机立即绑定

为什么隐式运算符必须是静态的?

为什么隐式运算符必须是静态的?

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 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号