是否有赋值运算符重载“替代项”?像转换运算符的“二进制”类似物(要兼顾两者)?

时间:2019-09-03 00:53:29

标签: c# operator-overloading operators instance conversion-operator

肯定想直接将值分配到我的类实例(隐式地分配给它的属性之一),但是除了重载赋值运算符(这是禁止的?)之外,我仅找到了转换运算符,这是我所需要的那种,但是它并没有以任何方式说明“被分配者”实例(相反,它创建并分配了新对象,并包含了所有含义)。

public class Foo
{
    public bool b = true;

    public float f = 1f;
    public float f2 = 10f;

    public float value 
    {
        get => b? f : f2; 
        set => b? f : f2;
    }

    public Foo(bool useFirstFloat, float f)
    {
        this.b = first;
        this.value = f;
    }

    public static implicit operator float(Foo foo) => foo.f;
    public static implicit operator Foo(float f) => new Foo(true, f); //bool is always "overwritten"

    public float this[bool useInstance] //For ugly workaround example
    {
        get => value; 
        set => useInstance? value : new Foo(false, value); //now with false
    }
}

示例:

Foo foo = new Foo(false, 100f); //bool must stay "false" after assignment
float f = 5f;
void SomeFunc()
{
    foo.value = f; //I want this, but not this way!
    foo = f; //Instead I want this to be the same thing as "foo.value = f" (not "foo = new Foo(b, f)"!)
    foo[true] = f; //Like this but without index parameter
    foo[false] = f; //Not this, again!
}

所以理想情况下,我需要这样的东西:

public static Foo operator =(Foo foo, float f) //Why is this so forbidden?
{
    foo.value = f;
    return foo;
}

有什么办法吗?在C#中对此有任何想法吗?

1 个答案:

答案 0 :(得分:0)

简单的答案是:(使用C ++)。但是有黑客可以实现类似的行为(不安全)!

public class Foo
{
    public bool b = true;

    public float f = 1f;
    public float f2 = 10f;

    public static Foo current;

    public float value 
    {
        get
        {
            current = this;
            return b? f : f2; 
        }
        set
        {
            current = this;
            if (b) f = value; else f2 = value;
        }
    }

    public static implicit operator float(Foo foo) => foo.f;
    public static implicit operator Foo(float f)
    {
        current.value = f;
        return current;
    }
}

不幸的是,目前默认情况下在C#中是不可能的,实际上是禁止的。但是,不管教条指示什么,突然之间都缺少功能,而一切都很好,所以我打开了issue,任何人都可以看到它的结果。