我希望能夠施展一類通用型(這是一個通用型的另一個接口)嵌套的接口類型,以它的界面,但會拋出異常接口。演員以與通用
我可以投的對象與泛型類型,以它的界面罰款(見行IWrapper ....),但是當我嘗試用一個接口作爲鑄造用它自己的泛型類型的類型我得到的錯誤。
我的想法是,可能我需要一個類型約束添加到節點的類型是IWrapper<U>
但隨後不再通用。
當然,如果對象是Node<Wrapper<object>
類型的節點和包裝器實現接口然後鑄造到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; }
}
}
嘗試標記索引節點爲'i節點'所以泛型參數是協變(在接口decleration) –
BradleyDotNET
@BradleyDotNET感謝,我現在得到的錯誤:'無效的方差:類型參數「T」必須是contravariantly有效'INode .Parent'。 'T'是協變的。' –
mbdavis
協變有一些非常具體的規則,顯然你打破了一個。直到你https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx – BradleyDotNET