C # 6 Строковая интерполяция + ошибка короткой строки формата?

В C # 6 введена интерполяция строк и более короткий способ указать строку формата.

IntPtr ptr = new IntPtr(0xff);

Console.WriteLine(ptr.ToString());      // 255
Console.WriteLine(ptr.ToString("x"));   // ff

Console.WriteLine($"0x{ptr.ToString("x")}"); // 0xff
Console.WriteLine($"0x{ptr:x}"); //0x255

Почему две последние строки выводят другой результат? Я что-то упускаю ?

Попробуйте это с DotnetFiddle

В качестве примечания здесь приведен исходный код IntPtr ToString () в ядре dotnet:

public unsafe  String ToString(String format) 
    {
        #if WIN32
            return ((int)m_value).ToString(format, CultureInfo.InvariantCulture);
        #else
            return ((long)m_value).ToString(format, CultureInfo.InvariantCulture);
        #endif
    }

Всего 2 ответа


Ваш пример кода:

Console.WriteLine($"0x{ptr:x}");

Это эквивалентно его строке. Формат брата:

Console.WriteLine(string.Format("0x{0:x}", ptr));

При применении вашей строки формата "x" , строка интерполяции / формат строки в конечном итоге достигает этой строки кода :

IFormattable formattableArg = arg as IFormattable;

К сожалению, хотя IntPtr имеет метод ToString () специального формата, он не реализует IFormattable , поэтому IFormattable его базовый .ToString() а строка формата отбрасывается.

Смотрите этот вопрос для получения дополнительной информации

Как и предлагал vasily.sib, вы можете вместо этого использовать $"0x{(int)ptr:x}" .

Попробуйте мой пример .


Как сказано в документации:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings

Например, используйте «X» для создания «ABCDEF» и «x» для получения «abcdef». Этот формат поддерживается только для целочисленных типов.

Указатель не является целочисленным типом. Например:

string.Format("{0:x}", ptr)

также возвращает 255.


Есть идеи?

10000