コードで渡したり使用したりする 2 種類の文字列があります。この 2 つは密接に関連していますが、混同しないでください。メソッド シグネチャ (および一般的には型の非互換性) が 2 つの異なる種類の文字列のセマンティックな意味を強制するように、単なる文字列であるが名前が異なる 2 つのクラスを使用することで、エラーを回避できると考えました。同時に、何百もの場所をリファクタリングsomething = "foo";
する必要はありませんでした。something.Value = "foo";
最初の考え:
private class FirstKind : string { }
private class SecondKind : string { }
もし私が持っているなら
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
で呼び出しようとするとMyMethod(secondKindVar, firstKindVar);
、コンパイラ エラーが発生します。
ぶつけた壁: string
封印。
再考:KindOf<T>
暗黙の変換演算子を使用して、値を取り込んで吐き出すだけのジェネリック クラスを作成します。このような:
private class KindOf<T>
{
public T Value { get; set; }
public KindOf() { Value = default(T); }
public KindOf(T val) { Value = val; }
public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
public static implicit operator KindOf<T>(T value) { return new KindOf<T>(value); }
}
このようにして、次のようなことができます:
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
私がぶつかった壁:KindOf<T>
クラスから何も継承していないようです: 派生型にはコンストラクターも演算子も存在しません。つまり、基本的に派生クラスの基本クラス全体を再実装する必要があります。コードのコピー。うん。
だから私はここで基本的な何かが欠けているように感じます. 私がやろうとしていることについてのアイデアはありますか?