静态隐式运算符


157

我最近找到了以下代码:

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

什么static implicit operator意思

Answers:


262

这是一个转换运算符。这意味着您可以编写以下代码:

XmlBase myBase = new XmlBase();
XElement myElement = myBase;

而且编译器不会抱怨!在运行时,将执行转换运算符- myBase作为参数传入,并返回有效值XElement作为结果。

这是您作为开发人员告诉编译器的一种方式:

“尽管它们看起来像两种完全不相关的类型,但实际上存在一种从一种转换为另一种的方法;让我来处理如何做到这一点的逻辑。”


11
+1。我要补充一点,尽管偶尔会很好地使用隐式转换,但它也可能导致奇怪的/令人惊讶的错误,并使(人类)API用户感到困惑。举例来说,BCL中很少使用隐式转换。谨慎使用!
德鲁·诺阿克斯

13

这样的隐式运算符意味着您可以隐式转换XmlBaseXElement

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;

这种显式转换仍然可以工作吗?XElement xelement = (XElement)xmlBase;在问题中说static,它必须是静态的吗?它可以是非静态的,因此可以实例化吗?
有抱负

6

另一个有趣的用法是(Unity用来检查对象(因此是MonoBehavior的实例)是否为空):

public static implicit operator bool (CustomClass c)
{
    return c != null;
}

请注意,代码必须在类内部(在这种情况下为CustomClass)。这样,您可以执行以下操作:

void Method ()
{
    CustomClass c1 = null;
    CustomClass c2 = new CustomClass ();

    bool b1 = c1; // is false
    bool b2 = c2; // is true

    if (!c1 && c2)
    {
        // Do stuff
    }
}

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


1
好招!有一点要注意:该static implicit operator bool方法必须声明里面CustomClass。我已经 为此创建了一个DotNetFiddle以进行演示。
马特

1
@Matt-啊,我的回答是2岁。我稍微更新了代码并添加了提示。
战斗

4

这是一个隐式转换运算符(与Explicit运算符相反,后者需要(type)转换语法)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.