将 EqualityComparer<Child<T>> 转换为 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<Random base class/interface of T>
或 EqualityComparer<every possible base class/interface of T>
?
你无法将它与此进行比较:
Node<string> stringNode;
Node node = stringNode;
这是可行的,因为您的 class 定义 Node<T>
明确派生自 Node
的非通用版本
public class Node<T> : Node, INode<T>
当您查看 class 的定义时
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)
方法。
这对每个通用 class 都有效,例如。看到这个相关的,甚至可能重复的问题:
更新:
之后,注意到 IEqualityComparer<T>
被定义为 IEqualityComparer<in T>
- 所以逆变是可能的,你可以看看这个:
Variance in generic Interfaces
您目前使用的另一种方法是可能的,接口 IEqualityComparer<T>
不适用于 class。
IEqualityComparer<INode> comparer = EqualityComparer<INode>.Default;
IEqualityComparer<INode<int>> intcomparer = comparer;
我有这样的等级制度:
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<Random base class/interface of T>
或 EqualityComparer<every possible base class/interface of T>
?
你无法将它与此进行比较:
Node<string> stringNode;
Node node = stringNode;
这是可行的,因为您的 class 定义 Node<T>
明确派生自 Node
public class Node<T> : Node, INode<T>
当您查看 class 的定义时
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)
方法。
这对每个通用 class 都有效,例如。看到这个相关的,甚至可能重复的问题:
更新:
之后,注意到 IEqualityComparer<T>
被定义为 IEqualityComparer<in T>
- 所以逆变是可能的,你可以看看这个:
Variance in generic Interfaces
您目前使用的另一种方法是可能的,接口 IEqualityComparer<T>
不适用于 class。
IEqualityComparer<INode> comparer = EqualityComparer<INode>.Default;
IEqualityComparer<INode<int>> intcomparer = comparer;