繁体   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