C# 使用隐式运算符重载

C# 使用隐式运算符重载,c#,struct,casting,operator-overloading,operators,C#,Struct,Casting,Operator Overloading,Operators,我创建了以下结构以跟踪我在游戏中使用的所有网络ID: public struct NetworkId { private static int _availibleId = 1; private int _id; public static implicit operator int(NetworkId i) { if (i._id == 0) { i._id = _availibleId++; }

我创建了以下结构以跟踪我在游戏中使用的所有网络ID:

public struct NetworkId {
    private static int _availibleId = 1;

    private int _id;

    public static implicit operator int(NetworkId i) {
        if (i._id == 0) {
            i._id = _availibleId++;
        }

        return i._id;
    }
}
我在有人试图访问时初始化ID。但我现在的问题是,当我像下面的例子一样使用id时,每次都会重新分配id

public class TestObject {
    private NetworkId _id;
    public NetworkId Id { get { return _id; } }

    public void Create {
        NetworkManager.SendPacket(new Packets.CreateObject(Id));
    }
}

我无法理解这里发生的事情。谢谢你的帮助

它需要是一个结构吗?使用类语义可以执行以下操作:

public class NetworkId
{
    private static int _availibleId = 1;
    public int Id { get; } = _availibleId++;

    public static implicit operator int(NetworkId i)
    {
        return i.Id;
    }
}

void Test() {
    int A = new NetworkId();  //A=1
    int B = new NetworkId();  //B=2
}

请显示字段private NetworkId\u id所在的代码;初始化为一个值。哦,等等,NetworkId是struct,所以它会被一次又一次地复制。易变结构是邪恶的,你知道。你没有展示足够的代码来说明如何使用NetWord来有效地回答这个问题。这是一个糟糕的想法,你不应该这样做。转换不应有副作用!您的代码表示每次我将此ID转换为整数时,都要创建一个不同的整数。你到底想在这里做什么?看起来你完全混淆了两件完全不同的事情:创建一个新的唯一标识符并将该标识符转换为整数。不一定,但因为它只表示一个值,所以更适合作为一个结构。为了让它发挥作用,我现在把它列为一门课,但我仍然想理解为什么我以前的方法不起作用。