【发布时间】:2012-12-30 21:12:04
【问题描述】:
当我尝试将返回类型转换为我自己定义的对象或一种自定义类型时,为什么隐式运算符会出现问题?
当我尝试转换并返回像int 这样的简单类型时,我没有问题,就像这样
public static implicit operator int(MyClass a)
{
return 123;
}
但是,当我尝试将类型转换为对象或自定义类型时,会出现错误。例如,如果我有这样的事情,我会得到一个编译时错误,说“用户定义的转换为 System.Object”:
public static implicit operator object(MyClass a)
{
return new {};
}
如果我有这个,我会得到同样的错误:
public static implicit operator CustomTestObject(MyClass a)
{
return new CustomTestObject();
}
使用隐式运算符时,如何将其转换为我自己的自定义类型以返回?
【问题讨论】:
-
我不明白为什么
CustomTestObject转换不起作用。 -
@mikez 我也想查看上次转换的确切编译器消息。另外我想知道它在里面是什么类(或结构),该类的继承链,以及
MyClass和CustomTestObject的继承链。在我的回答中,我有点假设一个是另一个的基类。 -
@JeppeStigNielsen 是的,这可以解释。
-
MyClass是一个继承自 Object 基类的普通类。我可以从您的回答中理解在这种情况下如何将其隐式转换为对象是行不通的。我刚刚意识到,在我的实际代码中,示例CustomTestObject是一个接口。我相信由于接口没有任何具体的实现,因此转换没有意义。非常感谢您的回答。 -
不允许用户定义的转换(隐式和显式
operator)进出接口。您收到的错误消息应该提到接口(您的问题没有)。您的类的某些派生类可以开始实现该接口。如果派生类隐式转换为接口(通过简单的引用转换),那将是令人困惑的,因为它实现了它,同时对同一接口进行了用户定义的转换。我认为这就是他们不允许与接口进行转换的原因之一。