我肯定想直接将值分配到我的类实例(隐式地分配给它的属性之一),但是除了重载赋值运算符(这是禁止的?)之外,我仅找到了转换运算符,这是我所需要的那种,但是它并没有以任何方式说明“被分配者”实例(相反,它创建并分配了新对象,并包含了所有含义)。
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#中对此有任何想法吗?
答案 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,任何人都可以看到它的结果。