私の最初の仮定は、ジェネリックであるため、文字列に対して行うように、舞台裏で値変換への参照を行うことができないということでした。これをサポートする例をまとめたいと思いました。:) このために何かをまとめるためにいくつかの仮定をしなければならなかったので、私の例は 100% ではないかもしれません. (私が使用したコードは一番下にあります)
私がちょうど持っていたとき、私はコンパイルするものを得ることができませんでした
class Comparer<T, TId>
{
private readonly Func<T, TId> m_idfunc;
public Comparer(Func<T, TId> idFunc)
{
m_idfunc = idFunc;
}
public bool Equals(T x, T y)
{
var xid = m_idfunc(x);
var yid = m_idfunc(y);
return (TId)xid == (TId)yid;
}
}
https://stackoverflow.com/a/390919/156708を見つけ、クラス宣言を次のように変更しました
class Comparer<T, TId> where TId : class
そしてコンパイルしました。ステップ1。
Equals
私は機能を次のように設定しました
public bool Equals(T x, T y)
{
var xid = m_idfunc(x);
var yid = m_idfunc(y);
return (TId)xid == (TId)yid;
}
結果はFalse
次のとおりです (xid|yid で値を生成するための完全なコードを参照してください)。ジェネリックがこれに関与しているという私の仮定に適合します。まだ十分ではありません。Generics の側面が削除された場合に何が起こるかを確認する必要があります。
Comparer
クラスを変更する
class Comparer<T>
{
private readonly Func<T, string> m_idfunc;
public Comparer(Func<T, string> idFunc)
{
m_idfunc = idFunc;
}
public bool Equals(T x, T y)
{
var xid = m_idfunc(x);
var yid = m_idfunc(y);
return xid == yid;
}
}
戻りますTrue
。
==
私はこれについて 100% ではありませんが、私の仮定は、クラスの演算子がstring
参照チェックではなく値チェックを行うという事実に基づいています。ジェネリックを使用する場合、参照チェックのみを行うように設定されている可能性が高く (IL を掘り下げてそこで何をしているのかを確認していません)、メモリ内の文字列の場所が同じでない場合は false を返します。(私は詳細を知りませんが、うまくいっているように見える作業仮説に過ぎないので、ちょっと詳しく説明しています)
ジェネリックを使用した完全なサンプル コードを以下に示します。
using System;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{
var compare = new Comparer<Example, string>(example => example.id(example));
var ex1 = new Example();
var ex2 = new Example();
Console.WriteLine(compare.Equals(ex1, ex2));
Console.ReadLine();
}
class Example
{
public string id(Example example)
{
return new string(new [] {'f', 'o', 'o'});
}
}
class Comparer<T, TId> where TId : class
{
private readonly Func<T, TId> m_idfunc;
public Comparer(Func<T, TId> idFunc)
{
m_idfunc = idFunc;
}
public bool Equals(T x, T y)
{
var xid = m_idfunc(x);
var yid = m_idfunc(y);
return (TId)xid == (TId)yid;
}
}
}
}
それが役に立てば幸いです...そして、私の推論がひどく間違っていないことを願っています. :)