【问题标题】:C# Conversion Operators not aware of casted to object?C# 转换运算符不知道强制转换为对象?
【发布时间】:2014-04-03 03:40:20
【问题描述】:

有人可以解释为什么强制转换为对象无法使用隐式转换运算符吗?隐式转换运算符似乎在装箱之前使用,但一旦装箱它就会失败。

class Program
{
    static void Main(string[] args)
    {
        var ms = new MemoryStream();
        var wrapper = new GenericWrapper<MemoryStream> { Item = ms };

        object obj = wrapper; 
        object objMs = ms;

        MemoryStream passingImplicitCast = (MemoryStream)wrapper;

        MemoryStream passingCast = (MemoryStream)objMs;
        MemoryStream failingCast = (MemoryStream)obj; //Throws Unable to cast object 
    }
}

class GenericWrapper<T>
{
    public T Item { get; set; }

    public static implicit operator T(GenericWrapper<T> value)
    {
        return value.Item;
    }
}

【问题讨论】:

  • 这也不是关于拳击,而是关于铸造。
  • @Dirk 是的,谢谢更新
  • 我已经回答了一个相关问题here。这应该会有所帮助

标签: c# casting


【解决方案1】:

你不能超越类型转换 objGenericWrapper&lt;MemoryStream&gt;,因为:

  1. object 不知道如何将它自己转换为 MemoryStream
  2. obj 原来是GenericWrapper&lt;MemoryStream&gt;

您唯一的选择是将obj 转换为GenericWrapper&lt;MemoryStream&gt;

MemoryStream failingCast = (MemoryStream)(GenericWrapper<MemoryStream>)obj;

并将其类型转换为 GenericWrapper&lt;MemoryStream&gt;,它现在知道如何将其自身隐式转换为类型 MemoryStream,因为 GenericWrapper&lt;MemoryStream&gt; 具有隐式运算符定义。

【讨论】:

  • 你是对的,但这不是唯一的选择。您可以使用动态并将责任 oc 转换推送到 CLR,这会很小心
【解决方案2】:

好吧,用这一行测试:

MemoryStream failingCast = (GenericWrapper<MemoryStream>)obj;

最后,“failingCast”是System.IO.MemoryStream

由于objobject,您需要更具体,并设置GenericWrapper&lt;MemoryStream&gt;。你需要返回值T:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多