有人可以解释为什么转换为对象无法使用隐式转换运算符吗?隐式强制转换操作符似乎在它装箱之前使用,但一旦装箱,它就会失败。
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;
}
}
答案 0 :(得分:0)
好吧,用这一行测试:
MemoryStream failingCast = (GenericWrapper<MemoryStream>)obj;
最后,“failingCast”是System.IO.MemoryStream
。
由于obj
是object
,您需要更具体,并设置GenericWrapper<MemoryStream>
。您需要返回值T
:
答案 1 :(得分:0)
您无法超越obj
类型转换为GenericWrapper<MemoryStream>
,因为:
object
不知道如何将自己转换为MemoryStream
obj
原来是GenericWrapper<MemoryStream>
您唯一的选择是将obj
投射到GenericWrapper<MemoryStream>
:
MemoryStream failingCast = (MemoryStream)(GenericWrapper<MemoryStream>)obj;
并将其类型转换为GenericWrapper<MemoryStream>
,它现在知道如何将其自动隐式转换为MemoryStream
类型,因为GenericWrapper<MemoryStream>
具有隐式运算符定义。