【问题标题】:Static implicit operator静态隐式运算符
【发布时间】:2011-05-15 11:54:57
【问题描述】:

我最近发现了这段代码:

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

static implicit operator 是什么意思?

【问题讨论】:

    标签: c# operators implicit-conversion


    【解决方案1】:

    这样的隐式运算符意味着您可以将XmlBase 隐式转换为XElement

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

    【讨论】:

    • 这种显式转换仍然可以工作吗? XElement xelement = (XElement)xmlBase;static 的问题中,它必须是静态的吗?不能是非静态的,所以可以实例化吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是conversion operator。这意味着你可以编写这样的代码:

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

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

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

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

      【讨论】:

      • +1。我要补充一点,虽然隐式转换偶尔会有很好的用法,但它也会导致奇怪/令人惊讶的错误,并且可能会使(人类)API 用户感到困惑。例如,在 BCL 中很少使用隐式转换。谨慎使用!
      • 如果有人能给出任何有用的现实生活场景,我将非常感激,这可以拯救其他东西无法使用或效率低下的地方。谢谢!
      • @eRaisedToX 我在一个项目中有一个例子(诚然已有十多年的历史了)- LINQ to SimpleDB,我们有一个 SimpleDbAttributeValue 可以是数字、字符串或其他值类型,我们希望允许客户编写像myValue > 2 这样的简单代码,隐式转换和运算符重载使其自然。 github.com/rexm/SimpleDb.Net
      • 一个很好的例子是来自 Microsoft.Azure.Cosmos.Client 程序集的 Microsoft.Azure.Cosmos.DatabaseResponse 类。在那里,它允许接收 DatabaseResponse 的用户使用简单的语句提取请求的 Database 对象。同时,DatabaseResponse 包含有关发出的原始 api 请求的信息(f.x. CreateDatabaseIfNotExistsAsync 是否返回 HTTP 状态代码 201 或 200)
      • 嗯...我想迟到总比不知道语言特性要好
      【解决方案4】:

      另一个有趣的用法是(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
          }
      }
      

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

      【讨论】:

      • 好招!需要注意的一点:static implicit operator bool 方法必须在CustomClass 内部 声明。我为它创建了一个DotNetFiddle 用于演示目的。
      • @Matt - 啊,我的回答到现在已经 2 岁了。我稍微更新了代码并添加了您的提示。
      • 看起来有人喜欢用 C# 编写类似 Javascript 的代码
      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2010-11-26
      • 2014-03-18
      相关资源
      最近更新 更多