C # 6 Строковая интерполяция + ошибка короткой строки формата? - PullRequest
5 голосов
/ 27 марта 2020

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 () в do tnet ядро:

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 ]

6 голосов
/ 27 марта 2020

Код вашего примера:

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

Эквивалент его строки. Брат формата:

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

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

IFormattable formattableArg = arg as IFormattable;

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

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

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

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

1 голос
/ 27 марта 2020

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...