繁体   English   中英

非静态隐式算子

[英]non-Static Implicit Operator

有没有人有一个雄辩的解决方案,因为缺乏对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

这是我正在寻找的功能:

     public implicit operator Foo(Bar b)
     {
         this.y = b.y;
     }

幸运的是,你不能这样做。 我说“幸运”,因为这对读者来说非常困惑 我建议你只需编写一个方法,例如MergeFrom ,这样你的代码就会读取:

// Object initializers used for readability.
Foo foo = new Foo { x = 42 };
Bar bar = new Bar { y = 52 };
foo.MergeFrom(bar);

这是在意图方面更加清晰,IMO。

赋值运算符总是将左侧的变量值设置为右侧的值 - 可能通过转换,但绝不会基于左侧变量的现有值。 这就是语言的工作原理 - 而你正试图改变它。

不要与语言作斗争:阅读代码的任何人都不会感谢你。 相反, 使用该语言的习语。

如果你真的想使用某种类型的运算符,你总是可以重载+运算符:

public implicit operator +(Foo lhs, Bar rhs)
{
    return new Foo { x = lhs.x, y = rhs.y };
}

然后你可以使用:

foo += bar;

...再次更清楚foo的最终价值取决于现有价值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM