[英]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.