我想用这样的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
};
答案 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似乎是错误的。但这是我的看法。