【发布时间】:2017-12-12 01:23:14
【问题描述】:
C# 7 的一个不错的新特性是可以为类定义解构器并将解构后的值直接分配给值元组。
但是,在对象被解构为单个值的情况下,我找不到将其分配给元组的方法。尽管有一个类型用于具有单个元素的元组 (ValueTuple<T>),但使用括号的速记语法在这里不起作用。我发现访问解构器的唯一方法是直接调用Deconstruct 方法,但这消除了它的好处,因为我可以为此使用任何方法。
有人知道将对象解构为单个值的更好方法吗?
这是我的测试代码:
class TestClass
{
private string s;
private int n;
public TestClass(string s, int n) => (this.s, this.n) = (s, n);
public void Deconstruct(out string s) => s = this.s;
public void Deconstruct(out string s, out int n) => (s, n) = (this.s, this.n);
}
static void Main(string[] args)
{
var testObject = new TestClass("abc", 3);
var (s1) = testObject; // sytax error (comma expected)
ValueTuple<string> t = testObject; // error: "no implicit conversion from TestClass to (string)"
testObject.Deconstruct(out string s2); // this works
var (s3, n) = testObject; // no problem
Console.WriteLine($"{s1} {t.Item1} {s2} {s3} {n}");
Console.ReadKey();
}
【问题讨论】:
-
对 ValueTuple 不太熟悉,但也许制作 ValueTuple 的那一行应该是这样的: ValueTuple
t = ValueTuple.Create(testObject); -
这里我也得到错误,没有从 TestClass 到 ValueTuple
的隐式转换。 -
你真的需要将它解构为元组吗?也许您正在寻找隐式演员表? docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
-
@Oleh - 你是对的,我可以将隐式转换运算符定义为字符串。但我本可以在 C# 7 之前做到这一点 - 所以使用一个参数的解构器仍然没有任何好处。