提问人:Torben Nielsen 提问时间:8/21/2021 最后编辑:Torben Nielsen 更新时间:8/21/2021 访问量:256
我可以重载 = 赋值运算符吗?[复制]
Can I overload the = assignment operator? [duplicate]
问:
如果我有一个这样的用户定义类型,那么在使用该类型时会有一些噪音,因为在分配或读取内容时必须添加 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# 中可能吗?
答:
2赞
Nenad
8/21/2021
#1
您可以在其他方向进行隐式转换 -> :string
CharArray
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/...:
评论
string
CharArray
_value = Encoding.ASCII.GetBytes(...)
GetBytes
_value
_value
=