【问题标题】:Use Tuple values in Object initalizer syntax在对象初始值设定项语法中使用元组值
【发布时间】:2022-10-04 21:05:08
【问题描述】:

我正在尝试使用命名元组的值初始化我正在创建的对象的属性。

像这样的东西

public Person DoIt() {
  return new Person {
    (First, Last) = GetFirstAndLast(id)
  };
}

public (string first, string last) GetFirstAndLast(int id) {
  return (\"First name\", \"Last name\");
}

我知道这样做可以达到相同的效果,但我不想使用额外的变量。

public Person DoIt()
{
    var (first, last) = GetFirstAndLast(0);
    return new Person
    {
        First = first,
        Last = last
    };
}

  • 您提出的语法根本不是该语言的一部分;您不能将元组解构为对象初始化程序。最接近的是Person result = new(); (result.First, result.Last) = GetFirstAndLast(id); return result;,我认为它足够简短和清晰,除了隐式转换运算符和采用元组的构造函数等更人为的选项。
  • GetFirstAndLast 返回一个元组而不是返回一个 Person 有什么原因吗?我知道这是一个例子,但是在现实世界的场景中,这将是有用的,而不是首先简单地使用正确的类型?
  • @Xerillio 在现实生活中,该方法需要返回两个值(一个枚举值和一个字符串)。使用结果的类型会创建一个类型的新实例,并用 GetFirstAndLast 方法的结果填充两个属性。它还从对象初始化器初始化其他字段。

标签: c# tuples namedtuple object-initializers


【解决方案1】:

您不能在对象初始化程序中执行此操作,但您可以在构造函数中执行类似操作

public class Person
{
    public string First { get; } //with(out) set or init
    public string Last { get; } //with(out) set or init
    public Person((string, string) _)
        => (First, Last) = _;
}
public Person DoIt()
  => new Person(GetFirstAndLast(id));

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 2018-11-06
    • 2020-09-21
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2021-08-31
    • 2019-09-23
    相关资源
    最近更新 更多