在C#中是否可以重载赋值运算符“=”?

7

我有一个复杂的对象类型,我正在覆盖“base.ToString()”方法,使其返回一个字符串属性值。

例如:

class foo
{
 public string StringValue{get;set;}
 public int SomeOtherValue{ get;set;}
 public override ToString()
 {
   return StringValue;
 }
}

这使我可以轻松地获取StringValue属性的值。

是否有一种方法可以覆盖或扩展基本功能,以便我可以使用简单的代码来设置StringValue属性,例如以下代码?

foo aFoo = new foo();
aFoo = "Some string value";

1
“aFoo.StringValue =“ Some string value”;” 真的那么难打吗?;-) - Adam Houldsworth
现在我仔细阅读了问题,我必须同意Adam的观点。C#故意不提供此处的支持,这样阅读代码时就可以清楚地了解到正在发生的事情。我们从C++中没有学到任何东西吗? - Jon
1
顺便问一下,你的原因是什么?懒惰吗?(别误会,我尊重这个)还是有意要让其他开发人员感到困惑?:-D 说真的,我真的很讨厌所有类型的运算符重载。如果没有其他的,"转到定义"不起作用,而且通过查看代码也无法得知正在发生什么。 - vgru
我本来觉得没有办法,但还是想问一下。其实这只是我的懒惰,因为我有很多遗留代码需要从直接赋值改成现在所需的方式。 - ChrisBD
5个回答

11

4
这将会创建一个全新的 foo,而不仅仅是设置现有 fooStringValue 属性。话虽如此,根据使用情况,这可能仍然是一个足够好的解决方案。 - Adam Houldsworth

7

此处所述,您无法重载=运算符。

请查看此页面以获取可重载运算符的完整列表。


3
不,这是不可能的。赋值运算符是不可重载的,有充分的理由。
即使在 C# 和现代面向对象编程语言的限制下,开发人员通常都会“滥用”系统,以使它做一些本不应该做的事情。如果你可以赋予赋值运算符一个与将引用值传递给变量不同的含义,那么当经验不足的开发人员使用它时,就会造成混乱。
您可以提供方法让您的对象从字符串中获取其值。
afoo.TakeValuesFrom("Some string value");

或者

MyThingy afoo = MyThingy.FromString("Some string value");

这将几乎与您所要求的完全相同,并且是完全合法和可读的。

1
尽管其他人的答案都是正确的,但我选择你的答案,因为你建议添加一个FromString方法,这也是我要采用的。 - ChrisBD

-2

不可以。这是 C# 语言规范的受保护部分。能够覆盖它就像覆盖你身体呼吸空气的能力,改为呼吸水一样。


-2
使用隐式转换运算符。它会完全满足你的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接