考虑你有两个类:
internal class Explicit
{
public static explicit operator int (Explicit a)
{
return 5;
}
}
internal class Implicit
{
public static implicit operator int(Implicit a)
{
return 5;
}
}
和两个对象:
var obj1 = new Explicit();
var obj2 = new Implicit();
你现在可以写:
int integer = obj2; // implicit conversion - you don't have to use (int)
或者:
int integer = (int)obj1; // explicit conversion
但:
int integer = obj1; // WON'T WORK - explicit cast required
当转换不丢失任何精度时,应使用隐式转换。显式转换意味着您可以降低一些精度,并且必须清楚地说明您知道自己在做什么。
还有另一个应用隐式/显式术语的上下文 - 接口实现。在这种情况下没有关键字。
internal interface ITest
{
void Foo();
}
class Implicit : ITest
{
public void Foo()
{
throw new NotImplementedException();
}
}
class Explicit : ITest
{
void ITest.Foo() // note there's no public keyword!
{
throw new NotImplementedException();
}
}
Implicit imp = new Implicit();
imp.Foo();
Explicit exp = new Explicit();
// exp.Foo(); // won't work - Foo is not visible
ITest interf = exp;
interf.Foo(); // will work
所以当你使用显式接口实现时,当你使用具体类型时,接口的方法是不可见的。这可以在接口是帮助接口时使用,而不是类的主要职责的一部分,并且您不希望其他方法误导使用您的代码的人。