我可以使用返回ValueTuple的函数来初始化对象吗?

时间:2018-08-17 13:15:58

标签: c# c#-7.0

我想用这样的ValueTuple初始化对象:

var m = new SearchResultViewModel
{
     (Elements, SomeNumber) = this.SearchResultItems()
};

private (List<string> a, int b) SearchResultItems()
{
    [...]
    return (list, 1024);
}

哪里

public class SearchResultViewModel
{
    public IList<string> Elements { get; set; }

    public long SomeNumber { get; set; }
}

是否可以这样(或类似)?编译器给了我很多错误: 无法使用集合初始化程序初始化类型“ SearchResultViewModel”,因为它未实现“ System.Collections.IEnumerable”, 无效的初始化器成员声明器, 名称“元素”在当前上下文中不存在, 名称“ SomeNumber”在当前上下文中不存在,

此代码可以正常运行:

var m = new SearchResultViewModel();
(m.Elements, m.SomeNumber) = this.SearchResultItems();

这也可以编译确定(但是我不想两次调用该函数):

var m = new SearchResultViewModel()
{
   Elements = this.SearchResultItems().Item1,
   SomeNumber = this.SearchResultItems().Item2
};

1 个答案:

答案 0 :(得分:-1)

如果您确实想做类似的事情,可以使用转换运算符。

public class SearchResultViewModel
  {
    public IList<string> Elements { get; set; }
    public long SomeNumber { get; set; }

    public static explicit operator SearchResultViewModel((List<string> elements, int someNumber) tuple)
    {
      return new SearchResultViewModel()
      {
        Elements = tuple.elements,
        SomeNumber = tuple.someNumber
      };
    }
  }

现在可以执行以下操作:

var m = SearchResultItems() as SearchResultViewModel;

尽管此解决方案有效,但我个人不是粉丝。用这种方式转换ValueTuple似乎是错误的。但这是我的看法。