1

JavaScript のような方法で C# コードを記述できるかどうかを確認したかったのですが、予期しない動作が発生しました。私は c# が壊れていないことを知っていますが、何が間違っているのか、なぜ私が思っていることをしないのか理解できません。

コード:

class Program
{
    static void Main(string[] args)
    {
        var person = CreatePerson(new{
            FirstName = "Lucas",
            LastName = "Ontivero",
            Age = 34
        });

        Console.WriteLine("Name....... : {0}", person.FullName);
        Console.WriteLine("IsJuvenile. : {0}", person.IsJuvenile);

        person.SetFirstName("Pablo");
        Console.WriteLine("Name....... : {0}", person.FullName);

        Console.ReadKey();
    }

    static private dynamic CreatePerson(dynamic cfg)
    {
        string firstName = cfg.FirstName;
        string lastName = cfg.LastName;
        var age = cfg.Age;

        return new{
            FullName = string.Format("{0} {1}", firstName, lastName),
            FirstName = firstName,
            LastName = lastName,
            SetFirstName = new Action<string>(fn => firstName= fn),
            SetLastName = new Action<string>(ln => lastName = ln),
            IsJuvenile = age < 18 
        };
    }
}

出力:

Name....... : Lucas Ontivero
IsJuvenile. : False
Name....... : Lucas Ontivero

しかし、私は期待しました

Name....... : Lucas Ontivero
IsJuvenile. : False
Name....... : Pablo Ontivero

firstName が変更されないのはなぜですか?

4

2 に答える 2

3

それは...しかしそうでFullNameはありません。内部で計算され、後で文字列に評価されるプロパティではなく、CreatePersonとして格納されます。string

で行ったように、ラムダを使用して遅延評価を引き起こすことができますSetFirstName

于 2012-05-23T03:45:16.260 に答える
0

FullName の最初の割り当てを提供します。
FullName を再割り当てする必要があります

FullName = string.Format("{0} {1}", firstName, lastName)

オンSetFirstName機能

于 2012-05-23T03:48:32.233 に答える