【问题标题】:C# overloading implicit conversion referencing the old valueC# 重载隐式转换引用旧值
【发布时间】:2019-12-20 23:03:37
【问题描述】:

即使我很确定我的问题可能没有解决方案,但我仍然想尝试一下,并向你们寻求建议。

假设我有一个简单的类

public class MyIntContainer
{
   public int myIntValue;
   public bool randomOtherValue;

   public MyIntContainer(int value)
   {
      myIntValue = value;
   }
}

现在我想像这样简单地分配我的变量:

MyIntContainer container = 10;

所以最简单的方法是像这样在我的类中添加一个隐式转换运算符

public static implicit operator MyIntContainer(int value)
{
   return new MyIntContainer(value);
}

问题是:我想保留 randomOtherValue,如果有的话。 所以如果我做这样的事情:

MyIntContainer container = new MyIntContainer(10);
container.randomOtherValue = true;
container = 20;

我希望最新的容器变量具有 myIntValue = 20 和 randomOtherValue = true; 我似乎无法找到任何方法来做到这一点。如果我们能以任何方式重载赋值运算符,这样的事情就有可能发生。我什至考虑给隐式运算符方法一个额外的“this MyIntContainer container”参数,它可以引用赋值运算符之前声明的变量。但显然这些都不起作用。 有什么好的技巧可以模仿这种行为吗?

提前致谢,问候 BOTHLine

【问题讨论】:

    标签: c# type-conversion operator-overloading implicit-conversion


    【解决方案1】:

    赋值运算符将值与旧值组合是没有意义的——这不是那个符号的意思。

    但是,您可以重载 |(逻辑 OR),这可能表示值的组合(例如 0x10 | 0x01 = 0x11)。

    public class MyIntContainer
    {
        public int myIntValue;
        public bool randomOtherValue;
    
        public MyIntContainer(int value)
        {
            myIntValue = value;
        }
    
        static public MyIntContainer operator | (MyIntContainer lhs, int rhs)
        {
            return new MyIntContainer(rhs) { randomOtherValue = lhs.randomOtherValue };
        }
    }
    

    测试:

    var x = new MyIntContainer(10);
    x.randomOtherValue = true;
    x |= 20;   //Combine x with the new value of 20
    
    Console.WriteLine("{0} {1}", x.myIntValue, x.randomOtherValue);
    

    输出:

    20 true
    

    【讨论】:

    • 是的,我可以在赋值运算符上看到你的观点。我现在面临的问题是我想为 int 之类的东西提供一个“替代”类型。我想在分配中保留的其他值由某种 GUI 处理。另一个用户应该能够像使用整数一样使用我的自定义类,这可以通过双向隐式转换来实现。但是,是的,然后其他值就会丢失,这对于 GUI 来说非常重要。我自己一直使用 |= 没有问题,但其他用户可能有。这是一个非常可靠的替代方案,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多