簡體   English   中英

轉換EqualityComparer <Child<T> &gt;進入EqualityComparer <Parent>

[英]Convert EqualityComparer<Child<T>> into EqualityComparer<Parent>

我有這樣的層次結構:

public interface INode
{
    //...
}

public interface INode<T> : INode
{
    //...
}

public class Node : INode
{
    //...
}

public class Node<T> : Node, INode<T>
{
    //...     
}

現在我想像這樣投射:

EqualityComparer<INode<int>> intcomparer = EqualityComparer<INode<int>>.Default;
EqualityComparer<INode> comparer = intcomparer;

為什么這種轉換無效? 以及如何解決?

為什么強制轉換有效?

是什么讓您相信EqualityComparer<T>源自EqualityComparer<T> EqualityComparer<Random base class/interface of T>EqualityComparer<every possible base class/interface of T> EqualityComparer<Random base class/interface of T> EqualityComparer<every possible base class/interface of T>

您無法將其與此:

Node<string> stringNode;
Node node = stringNode;

這是可行的,因為您的Node<T>類定義顯式派生自Node的非通用版本

public class Node<T> : Node, INode<T>

看看EqualityComparer<T>的類定義

public abstract class EqualityComparer<T> : 
    System.Collections.Generic.IEqualityComparer<T>,
    System.Collections.IEqualityComparer

您可以看到沒有非通用版本,但是您可以將代碼更改為他的:

EqualityComparer<INode<int>> intcomparer = EqualityComparer<INode<int>>.Default;
IEqualityComparer comparer = intcomparer;

但是, IEqualityComparer將沒有有關您的INode信息,而僅定義一個Equals(object, object)方法。

例如,這對於每個通用類均有效。 看到這個相關的,甚至是重復的問題:

將Generic <Derived>強制轉換為Generic <Base>

更新:

之后,注意到IEqualityComparer<T>被定義為IEqualityComparer<in T> -因此可能是互變的,您可以看一下:

通用接口中的差異

當前的另一種解決方法是可行的,因為IEqualityComparer<T>接口不適用於類。

IEqualityComparer<INode> comparer = EqualityComparer<INode>.Default;
IEqualityComparer<INode<int>> intcomparer = comparer;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM