我可以重载 = 赋值运算符吗?[复制]

Can I overload the = assignment operator? [duplicate]

提问人:Torben Nielsen 提问时间:8/21/2021 最后编辑:Torben Nielsen 更新时间:8/21/2021 访问量:256

问:

如果我有一个这样的用户定义类型,那么在使用该类型时会有一些噪音,因为在分配或读取内容时必须添加 propertyname 值

public class CharArray
{
    private byte[] _value;

    public CharArray(int length)
    {
        _value = new byte[length];
    }

    public string Value
    {
        get => Encoding.ASCII.GetString(_value);
        set
        {
            if (value.Length > _value.Length)
                throw new Exception($"Max length is {_value.Length} characters");

            _value = Encoding.ASCII.GetBytes(value.PadRight(_value.Length));
        }
    }
}

所以用法是这样的:

CharArray field = new CharArray(10);
field.Value = "Test";
string fieldAsString = field.Value;

在读取值时,删除 Value 属性非常容易,只需添加一个隐式运算符即可。这将使 CharArray 的用户能够避免“.值“时读取值

    public static implicit operator string(CharArray c)
    {
        return c.Value;
    }

但是,我还没有找到避免 .赋值时的 value 属性。有什么想法吗?

我不能使用静态方法,因为我需要构造函数中给出的值。所以我想我正在寻找一种在非静态方法中重载 = 运算符的方法。这在 C# 中可能吗?

C# -关键字 赋值运算符

评论

0赞 Sweeper 8/21/2021
显然,您知道隐式转换运算符的存在,那么为什么不添加另一个隐式运算符 from to 呢?stringCharArray
2赞 Sweeper 8/21/2021
我刚刚注意到了这一点。字节数组的初始长度在这里是相当荒谬的。静态隐式运算符不是“丢失”此值的原因。当你这样做时,你已经失去了这个价值。 不在乎作业前的长度。它返回一个数组,其中的字节数刚好足以对字符串进行编码,而长度不一定完全相同。_value = Encoding.ASCII.GetBytes(...)GetBytes_value_value
1赞 Torben Nielsen 8/21/2021
@SnowGroomer 我是否过度简化了我的示例代码?真正的代码用于用 COBOL 或 C 等语言定义的结构的类型定义,其中字符串是固定大小的 char 数组。这种 fized 大小的 char-array 的长度在构造函数中给出。
2赞 Sweeper 8/21/2021
请参阅此处的可重载(和非重载)运算符列表:learn.microsoft.com/en-us/dotnet/csharp/language-reference/...我很惊讶还没有人发布这个。很清楚属于哪个群体。=
1赞 Torben Nielsen 8/21/2021
@Olivier Rogier:是的,确实如此。这不是我所希望的,但至少它解释了为什么这是不可能的。谢谢。(你想把它作为一个答案,而不仅仅是一个评论?

答:

2赞 Nenad 8/21/2021 #1

您可以在其他方向进行隐式转换 -> :stringCharArray

public static implicit operator CharArray(string s)
{
    return new CharArray(s.Length){ Value = s };
}

然后这工作:

CharArray field = new CharArray(10);
field = "Test"; // all good!
string fieldAsString = field;

评论

0赞 Torben Nielsen 8/21/2021
我会失去原始构造函数中给出的长度(即值 10)
0赞 Nenad 8/21/2021
然后你正在尝试覆盖,而不仅仅是运算符,正如你所说。那是不可能的。.Value ==
1赞 Torben Nielsen 8/21/2021
对于任何寻找此内容的人,这里给出了不可能的原因 stackoverflow.com/questions/18782218/...