静态隐式运算符

时间:2010-11-25 04:32:55

标签: c# operators implicit-conversion

我最近发现了这段代码:

 public static implicit operator XElement(XmlBase xmlBase)
 {
     return xmlBase.Xml;
 }

static implicit operator是什么意思?

4 个答案:

答案 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
    }
}

很显然,最臭名昭著的用法是使用它将您的一个类转换为另一个类。但是将它们与基本类型一起使用也是值得考虑的……而且我很少提到它。