jos*_*osh 2 c# implicit implicit-conversion
有没有人有一个雄辩的解决方案,因为缺乏对C#中非静态隐式运算符的支持?以下代码显示了我当前的问题:
class Foo
{
public int x { get; set; }
public int y { get; set; }
public Foo()
{
}
public static implicit operator Foo(Bar b)
{
Foo newFoo = new Foo();
newFoo.y = b.y;
return newFoo;
}
}
class Bar
{
public int y { get; set; }
public Bar()
{
}
}
Foo foo = new Foo();
foo.x = 42;
Bar bar = new Bar();
bar.y = 52;
foo = bar;
Console.WriteLine(foo.x); // THIS PRINTS 0
Run Code Online (Sandbox Code Playgroud)
这是我正在寻找的功能:
public implicit operator Foo(Bar b)
{
this.y = b.y;
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
幸运的是,你不能这样做.我说"幸运",因为这对读者来说非常困惑.我建议你只是编写一个方法,例如MergeFrom,这样你的代码就会读取:
// Object initializers used for readability.
Foo foo = new Foo { x = 42 };
Bar bar = new Bar { y = 52 };
foo.MergeFrom(bar);
Run Code Online (Sandbox Code Playgroud)
这是多大的意图方面更加清晰,IMO.
赋值运算符总是将左侧的变量值设置为右侧的值 - 可能通过转换,但绝不会基于左侧变量的现有值.这就是语言的工作原理 - 而你正试图改变它.
不要与语言作斗争:阅读代码的任何人都不会感谢你.相反,使用该语言的习语.
如果你真的想使用某种类型的+运算符,你总是可以重载运算符:
public implicit operator +(Foo lhs, Bar rhs)
{
return new Foo { x = lhs.x, y = rhs.y };
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用:
foo += bar;
Run Code Online (Sandbox Code Playgroud)
...再次更清楚的是,最终价值foo取决于现有价值.
| 归档时间: |
|
| 查看次数: |
1348 次 |
| 最近记录: |