隐式转换为string/string内部插入的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类似于VBAs DAO访问,并始终公开1行数据(currentRow)。

我使用ExcelDataField类来封装Excel数据表中的数据,因为数据是从excel表单中导出的。

 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; } } 

目前我为testing目的asuming所有数据可以稍后轻松地处理为一个string,我做了这个类ExcelDataField : ExcelDataField<string>的重载ExcelDataField : ExcelDataField<string>这是我正在使用的类读取Excel表单,只是读它回来控制台。

一切正常,只要我不使用内插string,显然没有find我的隐式转换。 我试图将ExcelDataField : ExcelDataField<string >更改为ExcelDataField : ExcelDataField<String>但都不起作用。

在我的理解内插string使用的FormattableStringtypes没有任何从string或string只有显式的隐式转换。

我的问题是任何人都可以更详细地解释这里究竟发生了什么,有没有一种干净的方式可以使用插值string?

插值string将被编译为一个string.Format(...)expression式,或编译成一个包装类FormattableString在内部使用string.Format(...)

以下是每个参数所考虑选项的简要说明:

  1. IFormatProviderstring.Format(...)的时候是否返回一个ICustomFormatter ? 如果是,那么请先为每个值查阅ICustomFormatter.Format
  2. 参数值的types是否实现IFormattable ? 如果是,则调用IFormattable.ToString
  3. 如果不是,则直接在该值上调用.ToString()方法

所以在你的情况下,你最好的select可能只是覆盖ToString()

确切的代码(至less在参考源)是在StringBuilder ,在这里find:StringBuilder.cs,行1441 – AppendFormatHelper方法 。

这相当简单。 $"{currentRow["Projekt"]}"string.Format("{0}", currentRow["Projekt"]) 。 在由currentRow["Projekt"]提供的object实例上,调用ToString方法。 object的默认实现是返回types名称。

所以基本上你所要做的就是重写这个行为。 你可以通过覆盖ToString方法来做到这一点:

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