【发布时间】:2011-05-15 11:54:57
【问题描述】:
我最近发现了这段代码:
public static implicit operator XElement(XmlBase xmlBase)
{
return xmlBase.Xml;
}
static implicit operator 是什么意思?
【问题讨论】:
标签: c# operators implicit-conversion
我最近发现了这段代码:
public static implicit operator XElement(XmlBase xmlBase)
{
return xmlBase.Xml;
}
static implicit operator 是什么意思?
【问题讨论】:
标签: c# operators implicit-conversion
这样的隐式运算符意味着您可以将XmlBase 隐式转换为XElement。
XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
【讨论】:
XElement xelement = (XElement)xmlBase; 在static 的问题中,它必须是静态的吗?不能是非静态的,所以可以实例化吗?
这是一个隐式转换运算符(与显式运算符相反,它需要(type) 转换语法)
【讨论】:
这是conversion operator。这意味着你可以编写这样的代码:
XmlBase myBase = new XmlBase();
XElement myElement = myBase;
而且编译器不会抱怨!在运行时,将执行转换运算符 - 将 myBase 作为参数传入,并返回一个有效的 XElement 作为结果。
这是您作为开发人员告诉编译器的一种方式:
“尽管它们看起来像两种完全不相关的类型,但实际上有一种方法可以从一种转换为另一种;让我来处理如何做的逻辑。”
【讨论】:
SimpleDbAttributeValue 可以是数字、字符串或其他值类型,我们希望允许客户编写像myValue > 2 这样的简单代码,隐式转换和运算符重载使其自然。 github.com/rexm/SimpleDb.Net
另一个有趣的用法是(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 用于演示目的。