【问题标题】:Implicit operator has error when converting to custom defined type隐式运算符在转换为自定义类型时出错
【发布时间】: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 我也想查看上次转换的确切编译器消息。另外我想知道它在里面是什么类(或结构),该类的继承链,以及MyClassCustomTestObject的继承链。在我的回答中,我有点假设一个是另一个的基类。
  • @JeppeStigNielsen 是的,这可以解释。
  • MyClass 是一个继承自 Object 基类的普通类。我可以从您的回答中理解在这种情况下如何将其隐式转换为对象是行不通的。我刚刚意识到,在我的实际代码中,示例CustomTestObject 是一个接口。我相信由于接口没有任何具体的实现,因此转换没有意义。非常感谢您的回答。
  • 不允许用户定义的转换(隐式和显式operator)进出接口。您收到的错误消息应该提到接口(您的问题没有)。您的类的某些派生类可以开始实现该接口。如果派生类隐式转换为接口(通过简单的引用转换),那将是令人困惑的,因为它实现了它,同时对同一接口进行了用户定义的转换。我认为这就是他们不允许与接口进行转换的原因之一。

标签: c# implicit-conversion


【解决方案1】:

您不能声明到您自己的基类之一的隐式转换。 System.Object 始终是您的(直接或间接)基类。通过继承,已经有到基类的隐式转换。那么怎么会有两个隐式转换呢? C# 规范有理由禁止这样做!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多