2015-11-25 82 views
0

我希望能夠施展一類通用型(這是一個通用型的另一個接口)嵌套的接口類型,以它的界面,但會拋出異常接口。演員以與通用

我可以投的對象與泛型類型,以它的界面罰款(見行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; } 
    } 

} 
+2

嘗試標記索引節點爲'i節點'所以泛型參數是協變(在接口decleration) – BradleyDotNET

+0

@BradleyDotNET感謝,我現在得到的錯誤:'無效的方差:類型參數「T」必須是contravariantly有效'INode .Parent'。 'T'是協變的。' – mbdavis

+0

協變有一些非常具體的規則,顯然你打破了一個。直到你https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx – BradleyDotNET

回答

0

這裏你正在做不正確的幾件事情。讓我們刪除var,看看發生了什麼。

Node<object> node = new Node<object>(); 
node.Value = wrapper; 

這顯然Node<Object>Node<IWrapper<object>>型沒有。這就是爲什麼你會遇到錯誤。由於沒有爲T或U定義的約束條件,因此您可以對其進行圖像處理,如將Node<Object>轉換爲Node<int>,這在C#中顯然不允許。

可能是你應聲明節點爲:

Node<IWrapper<object>> node = new Node<IWrapper<object>>(); 
node.Value = wrapper; 

現在下面的行應該很好地工作。

INode<IWrapper<object>> castedNode = (INode<IWrapper<object>>)node; 

爲了防止出現此類錯誤,您應該使用通用約束。

+0

啊,簡單的把它嵌入你的施法/協方差將是無效的。乾杯! – mbdavis