【问题标题】:c# implicit operatorc# 隐式运算符
【发布时间】:2014-04-13 01:22:55
【问题描述】:

我正在编写一个运行用户定义算法的应用程序。我想跟踪使用的变量,所以我创建了 TVar 类,当它们被改变或窥视时会引发事件。我已经这样做了

public static implicit operator int(TVar v)
{
    Tracker.Track(v.name, EventType.Variable, EventAction.Peek, v.var);
    return (int)v.var;
}

现在我想知道用户何时更改值,并且我有

public static implicit operator TVar(int i)
{
    Tracker.Track(/* I need TVar.Name here */, EventType.Variable, EventAction.Change, i);
    return new TVar(i);
}

但您可能已经注意到,我使用“名称”来识别不同的 TVar。现在,我创建新的 TVar var1 并将其命名为“第一个 var”,用它做一些事情(跟踪器接收信息),当我将 var1 更改为其他 int 时,它会丢失它的名称(因为我返回了新的 TVar,而不是实际的)请帮忙!

【问题讨论】:

  • 第二个代码 sn-p 中的 v 是什么?

标签: c# .net operator-keyword implicit-conversion


【解决方案1】:

这不会按您希望的方式工作,因为当您定义隐式转换运算符时,您无法从运算符主体内访问左值。根据定义,赋值总是丢弃变量引用的值(如果有的话)。

TVar foo = new TVar("Foo", 13);
foo = 42;

在第一行foo被初始化后,它引用了TVar的一个实例。但是第二行丢弃了 foo 的旧值并用另一个 TVar 实例替换它。

实现你想要的唯一方法是创建一个实例(非静态)方法TVar.Assign(int)

public void Assign(int value)
{
    this.Value = value;
    Tracker.Track(this.Name, ...);
}

【讨论】:

  • 感谢您向我澄清这一点。我担心这是解决这个问题的唯一方法。
猜你喜欢
  • 1970-01-01
  • 2013-08-25
  • 2010-10-27
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2010-12-09
相关资源
最近更新 更多