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