所以我偶然发现了以下内容:

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工作表中出来的数据,因为数据是动态生成的。
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>进行了重载,该类是我用来将Excel工作表读入并将其读回到控制台的类。

只要我不使用插值字符串(显然找不到我的隐式转换),一切都可以正常工作。我试图将ExcelDataField : ExcelDataField<string>更改为ExcelDataField : ExcelDataField<String>,但两者均不起作用。

以我的理解,插值字符串使用FormattableString类型,该类型没有从字符串或仅显式的字符串进行任何隐式转换。

我的问题是,谁能更详细地说明这里到底发生了什么,是否有一种干净的方法可以使用插值的字符串?

最佳答案

内插的字符串将被编译成string.Format(...)表达式,或者被编译成内部使用string.Format(...)的包装类FormattableString

以下是为每个此类参数考虑的选项的摘要:

  • 询问时,给IFormatProviderstring.Format(...)是否返回ICustomFormatter?如果是,则首先请为每个值查询ICustomFormatter.Format
  • 参数值的类型是否实现IFormattable?如果是,那么IFormattable.ToString称为
  • 如果否,则直接在值
  • 上调用.ToString()方法

    因此,在您的情况下,最好的选择可能是仅覆盖ToString()

    确切的代码(至少在引用源中)位于here: StringBuilder.cs, line 1441 - AppendFormatHelper method中,位于ojit_a中。

    09-27 22:25