【发布时间】:2020-11-20 20:09:16
【问题描述】:
我想知道是否有人可以向我指出== 运算符如何解析隐式转换的官方文档。
我有这个结构:
public readonly struct Name
{
private readonly string _value;
public Name(string name)
{
if (name == null)
throw new ArgumentNullException(nameof(name));
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("Invalid name.");
_value = name;
}
public static implicit operator string(Name name) => name._value;
public override string ToString()
{
return _value;
}
}
然后我运行以下代码:
var a = new Name("a");
var b = new Name("a");
var eq = a == b;
因为我已经在结构上定义了隐式转换运算符到字符串,所以这个相等性检查返回true。
它以某种方式解决了Name 可以转换为string,并使用string 比较,因为== 不适用于用户定义的结构,除非专门重载它。
我已尝试查找有关 == 运算符如何解析可以比较的类型的文档,但有人可以指出正确的方向吗?
【问题讨论】:
-
我认为
==可以比较任何东西,只要它来自同一类型。如果其中一个不是同一类型,则需要先进行转换。 -
@Steven 但它以某种方式解决了
Name可以转换为string,并使用string比较,因为==不适用于用户定义的结构而无需专门重载它. -
从 Binary operator overload resolution 开始,但预计必须从那里跟随链接,并注意不会有一个页面专门谈论
==和隐式转换。您必须阅读并理解这些内容,然后遵循它们所描述的含义 -
我不知道你为什么被骗了,这似乎是一个真正有趣的问题。当我设置相同的情况但使用自定义类
S(实现operator ==)而不是string时,它不会使用它!
标签: c#