我希望能够将具有泛型类型(具有泛型类型的另一个接口)的类强制转换为它的接口,但抛出异常。
我可以将具有泛型类型的对象强制转换为其接口(请参阅IWrapper行....)但是当我尝试使用接口作为类型进行转换时,我自己的泛型类型会出错。
我的想法是,我可能需要将类型约束添加到Node的类型为IWrapper<U>
,但它不再是通用的。
当然,如果对象的类型为Node<Wrapper<object>
,其中node和wrapper实现接口,那么转换为INode<IWrapper<object>>
应该可以正常工作吗?
这是我的SSCEE:
namespace Test
{
class Program
{
static void Main(string[] args)
{
Wrapper<object> wrapper = new Wrapper<object>();
IWrapper<object> castedWrapper = (IWrapper<object>)wrapper; // Works fine
var node = new Node<object>();
node.Value = wrapper;
INode<IWrapper<object>> castedNode = (INode<IWrapper<object>>)node;
// Unable to cast object of type 'Test.Node`1[System.Object]' to type 'Test.INode`1[Test.IWrapper`1[System.Object]]'.
}
}
class Node<T> : INode<T>
{
public INode<T> Parent { get; set; }
public T Value { get; set; }
}
class Wrapper<U> : IWrapper<U>
{
public U WrappedValue { get; set; }
}
interface INode<T>
{
INode<T> Parent { get; set; }
T Value { get; set; }
}
interface IWrapper<U>
{
U WrappedValue { get; set; }
}
}
答案 0 :(得分:0)
这里你做错了一些事。请删除var
,看看发生了什么。
Node<object> node = new Node<object>();
node.Value = wrapper;
很明显,Node<Object>
不属于Node<IWrapper<object>>
类型。这就是为什么你会收到错误的原因。由于没有为T或U定义约束,因此您可以执行将Node<Object>
转换为Node<int>
的操作,这在C#中显然是不允许的。
可能是你应该将Node声明为:
Node<IWrapper<object>> node = new Node<IWrapper<object>>();
node.Value = wrapper;
现在下面的行应该可以正常工作。
INode<IWrapper<object>> castedNode = (INode<IWrapper<object>>)node;
要防止此类错误,您应该使用通用约束。