簡體   English   中英

在插值字符串內隱式轉換為String / string

[英]Implicit conversion to String/string inside interpolated string

所以我偶然發現了以下情況:

Console.WriteLine(currentRow["Projekt"]);
Console.WriteLine($"{currentRow["Projekt"]}");
Console.WriteLine($"{(string)currentRow["Projekt"]}");

隨着輸出:

> Data that i want
> Namespace.ExcelDataField
> Data that i want

ExcelDataField我顯然是一個類,我寫的是幫助我從excel表中讀取數據。 我嘗試將其實現為與MoveFirst / Next類似的VBA DAO訪問,並始終暴露1行數據(currentRow)。

我使用ExcelDataField類來封裝來自excel表格的數據,因為數據來自excel表格中的dynmic。

public class ExcelDataField<T>
{
    private Excel.Range m_XlRange;
    private int m_Row;
    private int m_Col;

    public T Data
    {
        get
        {
            return (T)(this.m_XlRange.Cells[this.m_Row, this.m_Col] as Excel.Range)?.Value2;
        }

        set
        {
            this.m_XlRange.Cells[this.m_Row, this.m_Col] = value;
        }
    }

    public ExcelDataField(Excel.Range range, int row, int col)
    {
        this.m_XlRange = range;
        this.m_Row = row;
        this.m_Col = col;
    }

    public static implicit operator T(ExcelDataField<T> dataField)
    {
        return dataField.Data;
    }
}

目前我正在考慮測試目的,以后所有數據都可以輕松地作為一個字符串來處理,這使我的類ExcelDataField : ExcelDataField<string>的重載ExcelDataField : ExcelDataField<string>這是我用來讀取excel表並只讀它的類控制台。

只要我沒有使用內插字符串,顯然找不到我的隱式轉換,一切正常。 我嘗試將ExcelDataField : ExcelDataField<string >更改為ExcelDataField : ExcelDataField<String>但兩者都不起作用。

在我的理解中,插值字符串使用FormattableString類型,該類型沒有任何來自字符串的隱式轉換或僅顯式字符串。

我的問題是,任何人都可以更詳細地解釋這里到底發生了什么,是否有一種干凈的方式讓我能夠使用插值字符串?

這很容易。 $"{currentRow["Projekt"]}"string.Format("{0}", currentRow["Projekt"]) currentRow["Projekt"]提供的object實例上,調用ToString方法。 object的默認實現是它返回類型名稱。

所以你基本上所要做的就是覆蓋那種行為。 您可以通過重寫ToString方法來實現:

public override string ToString()
{
    return dataField.Data?.ToString();
}

插值字符串將被編譯為string.Format(...)表達式,或者編譯為內部使用string.Format(...)的包裝類FormattableString

以下是針對每個此類參數考慮的選項的概述:

  1. 當被問到時,賦予string.Format(...)IFormatProvider返回ICustomFormatter嗎? 如果是,則首先查詢每個值的ICustomFormatter.Format
  2. 參數值的類型是否實現了IFormattable 如果是,則調用IFormattable.ToString
  3. 如果不是,則直接在值上調用.ToString()方法

所以在你的情況下,你最好的選擇可能就是覆蓋ToString()

確切的代碼(至少在參考源中)在StringBuilder ,在這里找到:StringBuilder.cs,第1441行 - AppendFormatHelper方法

暫無
暫無

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

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