C#转换运算符不知道是否转换为对象?

时间:2014-03-02 04:36:10

标签: c# casting

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

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;
    }
}

2 个答案:

答案 0 :(得分:0)

好吧,用这一行测试:

MemoryStream failingCast = (GenericWrapper<MemoryStream>)obj;

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

enter image description here

由于objobject,您需要更具体,并设置GenericWrapper<MemoryStream>。您需要返回值T

答案 1 :(得分:0)

您无法超越obj类型转换为GenericWrapper<MemoryStream>,因为:

  1. object不知道如何将自己转换为MemoryStream
  2. obj原来是GenericWrapper<MemoryStream>
  3. 您唯一的选择是将obj投射到GenericWrapper<MemoryStream>

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

    并将其类型转换为GenericWrapper<MemoryStream>,它现在知道如何将其自动隐式转换为MemoryStream类型,因为GenericWrapper<MemoryStream>具有隐式运算符定义。