我最近发现了这段代码:
public static implicit operator XElement(XmlBase xmlBase)
{
return xmlBase.Xml;
}
static implicit operator
是什么意思?
答案 0 :(得分:216)
这是conversion operator。这意味着您可以编写此代码:
XmlBase myBase = new XmlBase();
XElement myElement = myBase;
编译器不会抱怨!在运行时,将执行转换运算符 - 将myBase
作为参数传递,并返回有效的XElement
作为结果。
作为开发人员,这是一种告诉编译器的方法:
“即使这些看起来像两个完全不相关的类型,实际上有一种方法可以从一个转换为另一个;只是让我处理如何做的逻辑。”
答案 1 :(得分:11)
这样的隐式运算符意味着您可以隐式地将XmlBase
转换为XElement
。
XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
答案 2 :(得分:4)
它是一个隐式转换运算符(与Explicit运算符相对,它需要(type)
转换语法)
答案 3 :(得分:1)
另一个有趣的用法是(Unity用来检查对象(因此是MonoBehavior的实例)是否为空):
public static implicit operator bool (CustomClass c)
{
if (c == null) return false;
else return true;
}
这样,您可以执行以下操作:
void Method ()
{
CustomClass c1 = null;
CustomClass c2 = new CustomClass ();
bool b1 = c1; // is false
bool b2 = c2; // is true
if (!c1 && c2)
{
// Do stuff
}
}
很显然,最臭名昭著的用法是使用它将您的一个类转换为另一个类。但是将它们与基本类型一起使用也是值得考虑的……而且我很少提到它。