[英]Why does this implicit type conversion in C# fail?
假设我有以下课程:
class Wrapped<T> : IDisposable
{
public Wrapped(T obj) { /* ... */ }
public static implicit operator Wrapped<T>(T obj)
{
return new Wrapped<T>(obj);
}
public void Dispose() { /* ... */ }
}
如您所见,它为T
→ Wrapped<T>
提供了隐式类型转换运算符。 最终,我希望能够如下使用此类:
interface IX { /* ... */ }
class X : IX { /* ... */ }
...
IX plainIX = new X();
using (Wrapped<IX> wrappedIX = plainIX)
{
/* ... */
}
但是,上述using
子句中的类型转换失败。 尽管我可以直接向wrappedIX
分配一个new X()
,但我不能为其分配任何类型为IX
的东西。 编译器将抱怨以下错误:
编译器错误CS0266:无法将类型'IX'隐式转换为'Wrapped <IX>'。 存在明确的onversion(您是否缺少演员表?)
我不明白 这是什么问题
我相信这是因为IX
是一个接口。 编译器认为也许IX
类型的值可能已经从Wrapped<IX>
派生了(即使Wrapped<T>
被密封了),所以它不使用转换。
详细信息非常复杂,请参见C#3.0规范的6.4.3和6.4.4节。 基本上因为IX
是一个接口,所以它不会被任何类型“包围”,这意味着6.4.4中的后续步骤将失败。
我建议您创建一个使用此方法Wrapped
的非泛型类型:
public static Wrapped<T> Of<T>(T item)
{
return new Wrapped<T>(item);
}
然后,您可以编写:
using (Wrapped<IX> wrappedIX = Wrapped.Of(plainIX))
出于各种原因,转换基本上会有些棘手-IMO通常会更容易理解简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.