静态隐式运算符

Bar*_*art 142 c# operators implicit-conversion

我最近发现这个代码:

 public static implicit operator XElement(XmlBase xmlBase)
 {
     return xmlBase.Xml;
 }
Run Code Online (Sandbox Code Playgroud)

什么static implicit operator意思?

Rex*_*x M 240

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

XmlBase myBase = new XmlBase();
XElement myElement = myBase;
Run Code Online (Sandbox Code Playgroud)

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

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

"尽管这些看起来像两个完全不相关的类型,但实际上有一种方法可以从一个转换为另一个;只需让我处理如何做到这一点的逻辑."

  • +1.我想补充一点,虽然偶尔会有很好的隐式转换用法,但它也会导致奇怪/令人惊讶的错误,并且可能会混淆(人类)API用户.举例来说,BCL中隐含转换的用法非常少.谨慎使用! (9认同)

Che*_*hen 12

这种隐含的操作意味着你可以转换XmlBaseXElement隐.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
Run Code Online (Sandbox Code Playgroud)

  • 这种显式转换无论如何都可以工作吗?`XElement xelement = (XElement)xmlBase;` 在问题中它说“static”,它必须是静态的吗?不能是非静态的,所以可以实例化吗? (2认同)

Bat*_*tle 9

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

public static implicit operator bool (CustomClass c)
{
    return c != null;
}
Run Code Online (Sandbox Code Playgroud)

请注意,代码必须在类内部(在本例中为 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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


And*_*ber 5

它是一个隐式转换运算符(与需要(type)转换语法的显式运算符相反)