繁体   English   中英

来自对象的隐式转换运算符

[英]Implicit cast operator from object

我想知道是否有人可以想到一个很好的解决方法,因为无法在自己的类上为对象添加隐式强制转换操作符。 以下示例说明了我想要的代码类型

public class Response
{
    public string Contents { get; set; }

    public static implicit operator Response(object source)
    {
        return new Response { Contents = source.ToString(); };
    }
}

这将无法编译,因为它扰乱了C#编译器,它告诉我

user-defined conversions to or from a base class are not allowed

将响应转化为响应和行动

public static implicit operator Response<T>(T source)

遗憾的是不是一种选择。 我的猜测是否定的 ,但任何人都可以想到一个很好的解决方法/黑客来实现这一点。 我很乐意能够做到

public Response Foo()
{
   return new Bar();
}

最后得到一个表示Whatever.Namespace.Bar的Response.Contents

想一想

Response r = CreateSomeExampleResponse();
Response r2 = r;

具有为Response任何基类定义的用户定义转换。 这个例子会发生什么? 第二项任务含糊不清:

  • r2引用一个新的Response实例,其Content设置为r.ToString()
  • r2引用到实例r是指?

(好吧或R2必须用一些力量,光剑和东西做任何事情)

我们甚至可以将我们的想法扩展到Response子类,由于多态性,这些子类肯定是允许和正确的。

我想没有办法实现这一目标。 此外,您的代码可能会更好看,但它远远不能被理解。

我不喜欢这样的隐式转换 - 其他答案已经解释了为什么不允许这样做。 如果您真的不想在代码中使用构造函数调用,那么使转换变得容易的一个选项是通过扩展方法:

public static ResponseExtensions
{
    public static Response ToResponse(this object source)
    {
        return new Response { Contents = source.ToString(); };
    }
}

然后你至少可以:

public Response Foo()
{
   return new Bar().ToResponse();
}

一般来说,我对object的扩展方法持谨慎态度,请注意......将任何对象转换为Response是否真的有意义?

我建议使用动态类型而不是隐式对象转换。 它看起来基本上就像动态一样。

此外,请参阅此问题以讨论有关基类转换的争论:来自基类的用户定义转换运算符然而,这是一个非常具体的情况,其中真正需要强制转换。 您可能需要重新考虑您的设计。

您的成本计算没有解决您的问题的方法。 错误中明确指出了这一点: user-defined conversions to or from a base class are not allowed 由于每个类都继承了object ,因此您有自己的答案。 从继承Responseobject 意味着所有实例Response也实例object object隐式转换为Response意味着每个object都是一个Response ,这是一个废话!!!

在您的情况下,您可以简单地定义一个Bar - > Response运算符吗?

执行类型转换时 ,您必须能够定义转换算法。 你能告诉我你应该如何将一个object (一种只有哈希码和字符串表示的.NET中最通用的类​​型)转换为特定类型的对象?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM