[英]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
以下是針對每個此類參數考慮的選項的概述:
string.Format(...)
的IFormatProvider
返回ICustomFormatter
嗎? 如果是,則首先查詢每個值的ICustomFormatter.Format
。 IFormattable
? 如果是,則調用IFormattable.ToString .ToString()
方法 所以在你的情況下,你最好的選擇可能就是覆蓋ToString()
。
確切的代碼(至少在參考源中)在StringBuilder
,在這里找到:StringBuilder.cs,第1441行 - AppendFormatHelper方法 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.