簡體   English   中英

C# 7:如何使用元組將對象解構為單個值?

[英]C# 7:How can I deconstruct an object into a single value using a tuple?

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<T> ) 的元組的類型,但使用括號的速記語法在這里不起作用。

這是正確的。 元組語法僅適用於 2 個或更多值的元組,因此只有一個out參數的Deconstruct方法不是很有用。 (甚至還有一個ValueTuple類型為 0 個元素)

最短的解決方案是忽略第二個參數:

var (s1, _) = testObject;

編輯:根據評論,稍微澄清一下。
從 C# 7 開始,在這種情況下_不再是變量。 這是一項稱為“丟棄”的新功能。
即使您有多個輸出參數(即使它們是不同的類型),您也可以使用下划線忽略它們中的任何一個:

var (s1, _, _, _) = testObject;

C# 7.0 不支持解構為單個元素。

不清楚為什么需要這種機制,因為您可以簡單地訪問屬性或編寫轉換運算符來實現相同的目的。

從概念上講,一個元素的元組就是那個元素(你不需要一個元組來保存它)。 所以沒有元組語法(使用括號表示法)來促進這一點(更不用說它在語法上是模棱兩可的)。 這同樣適用於解構。

以下是我能找到的最相關的 LDM 筆記: 2017-03-15 (零和一元素元組和解構)。

在某些未來的遞歸模式場景中可能會允許這種解構,但這還沒有最終確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM