我正在try 合并几个包.包含所有特定 struct 的UnitsNet,以及Microsoft Mvvm,该Mvvm为INotifyPropertyChanged
的属性提供了大约Set<T>
个函数.这Set<T>
个函数中有一个需要IEqualityComparer<T>
.
我知道我的QuantityEqualityComparer
分与UnitsNet的每struct
分是一样的.我看到IEqualityComparer<in T>
是反变的.所以我想我明白下面的例子应该是可能的.但在这种通用方法中不接受等式比较器.
似乎不可能投_bar
到IQuantity
,我也试着打Set<IQuantity>()
.但这两条语句都会被编译器拒绝.
我现在实现的解决方案是一种缓存机制,它将通过反射创建特定的IEqualityComparer
,但这似乎有些过头了.
你可以在这里找到一个例子:https://dotnetfiddle.net/N7vfc9
using System;
using System.Collections.Generic;
public class Program
{
private static Length _bar;
public static void Main()
{
// Error: cannot convert from QuantityEqualityComparer to IEqualityComparer<Length>
Set(ref _bar, new Length(), new QuantityEqualityComparer());
}
// from Mvvm
public static bool Set<T>(ref T field, T value, IEqualityComparer<T> comparer)
{
return true;
}
}
public class QuantityEqualityComparer : IEqualityComparer<IQuantity>
{
public bool Equals(IQuantity x, IQuantity y)
{
// custom implementation
}
public int GetHashCode(IQuantity obj)
{
// custom implementation
}
}
// from UnitsNet
public interface IQuantity
{
}
public struct Length : IQuantity, IEquatable<Length>
{
public bool Equals(Length other)
{
return true;
}
}