使用通用

时间:2015-11-25 17:31:30

标签: c# generics interface casting

我希望能够将具有泛型类型(具有泛型类型的另一个接口)的类强制转换为它的接口,但抛出异常。

我可以将具有泛型类型的对象强制转换为其接口(请参阅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; }
    }

}

1 个答案:

答案 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;

要防止此类错误,您应该使用通用约束。