重複の可能性:
不可能な再帰的なジェネリッククラス定義?
私はちょうどそれを発見しました
public class Foo<T> where T : Foo<T>
{
}
合法です。正確にはどういう意味ですか?再帰的に見えますが、このようなものをインスタンス化することは可能ですか?
重複の可能性:
不可能な再帰的なジェネリッククラス定義?
私はちょうどそれを発見しました
public class Foo<T> where T : Foo<T>
{
}
合法です。正確にはどういう意味ですか?再帰的に見えますが、このようなものをインスタンス化することは可能ですか?
これが役に立たないとは言いません。流暢な構文をサポートする方法を以下の例で見てみましょう。親base
で実装を作成していて、流暢な宣言を提供したい場合は、この制約をこのように使用できます。
public class Parent<TChild>
where TChild : Parent<TChild>
{
public string Code { get; protected set; }
public TChild SetCode(string code)
{
Code = code;
return this as TChild; // here we go, we profit from a constraint
}
}
public class Child : Parent<Child>
{
public string Name { get; protected set; }
public Child SetName(string name)
{
Name = name;
return this // is Child;
}
}
[TestClass]
public class TestFluent
{
[TestMethod]
public void SetProperties()
{
var child = new Child();
child
.SetCode("myCode") // now still Child is returned
.SetName("myName");
Assert.IsTrue(child.Code.Equals("myCode"));
Assert.IsTrue(child.Name.Equals("myName"));
}
}
この制約をどのように使用できるかを例に挙げてください。