c#隐式运算符

时间:2014-04-13 01:22:56

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

我正在编写运行用户定义算法的应用程序。我想跟踪所使用的变量,因此我创建了类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);
}

但是你可能已经注意到我使用" name"识别不同的电视节目。现在,我创建了新的TVar var1,并将其命名为#34;首先是var",用它做一些事情(Tracker接收信息),当我将var1更改为其他int时,它会丢失它的名字(因为我返回新的TVar,而不是实际的那个)请帮助!

1 个答案:

答案 0 :(得分:3)

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

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, ...);
}