我正在嘗試結合幾個包。UnitsNet 包含所有特定結構,以及 Microsoft Mvvm,它具有一些很好Set<T>的屬性功能INotifyPropertyChanged。其中一個Set<T>功能要求IEqualityComparer<T>.
我知道來自 UnitsNetQuantityEqualityComparer的每個人都是一樣的。struct我看到這IEqualityComparer<in T>是逆變的。所以我想我明白下面的例子應該是可能的。但是這種通用方法不接受相等比較器。
似乎無法轉換_bar為IQuantity,我也嘗試呼叫Set<IQuantity>()。但是這兩個陳述句都被編譯器拒絕了。
我現在實作的解決方案是一種快取機制,它會IEqualityComparer通過反射創建特定的 s,但這似乎有點矯枉過正。
你可以在這里找到例子來玩它: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;
}
}
uj5u.com熱心網友回復:
呼叫您的QuantityEqualityComparer.Equals方法需要將長度結構裝箱,這就是逆變轉換失敗的原因。
差異僅適用于參考型別;如果為變體型別引數指定值型別,則該型別引數對于生成的構造型別是不變的。
來源
盡管這可能與您已經擁有的相似,但這是我要開始的;
public static bool Set<T>(ref T field, T value)
where T:IQuantity
=> Set<T>(ref field, value, QuantityEqualityComparer<T>.Instance);
public class QuantityEqualityComparer<T> : IEqualityComparer<T>
where T:IQuantity
{
public static QuantityEqualityComparer<T> Instance = new();
//...
}
然后使用反射或.Compile運算式樹來呼叫此.Set<T>方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474114.html
