7

重複の可能性:
不可能な再帰的なジェネリッククラス定義?

私はちょうどそれを発見しました

public class Foo<T> where T : Foo<T>
{

}

合法です。正確にはどういう意味ですか?再帰的に見えますが、このようなものをインスタンス化することは可能ですか?

4

1 に答える 1

2

これが役に立たないとは言いません。流暢な構文をサポートする方法を以下の例で見てみましょう。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"));
    }
}

この制約をどのように使用できるかを例に挙げてください。

于 2012-11-20T09:33:21.217 に答える