Почему это преобразование не работает в Powershell, как в C #? - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь преобразовать вычисленное значение в uint16. Я жестко запрограммирован ради примера. В C # это работает. Но то, что я считаю, это тот же код в Powershell не удается. Учтите следующее:

В примере кода powershell он выдает:

Cannot convert value "101398986" to type "System.UInt16". Error: "Value was either too large or too small for a UInt16."
At D:\OneDrive\Desktop\VaribleCasting2.ps1:2 char:1
+ [uint16]$v = [uint16]$g
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastIConvertible

Я пробовал [конвертировать] :: ToUInt16 ($ g), который он производит:

Exception calling "ToUInt16" with "1" argument(s): "Value was either too large or too small for a UInt16."
At D:\OneDrive\Desktop\VaribleCasting2.ps1:2 char:1
+ [uint16]$v = [convert]::ToUInt16($g)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : OverflowException

PowerShell (сбой):

$g = 101398986
[uint16]$v = [uint16]$g
$v

C # (успешно):

using System;

namespace NumericTypeTesting
{
    class Program
    {
        static void Main(string[] args)
        {
            var g = 101398986;
            UInt16 v = (UInt16)g;
            Console.WriteLine(v);
            Console.ReadLine();
        }
    }
}

Я ожидал, что .NET на обеих платформах даст одинаковый результат. Спасибо за любую помощь!

Ответы [ 2 ]

5 голосов
/ 07 мая 2019

Powershell по умолчанию проверяет арифметику (как Visual Basic), в отличие от C #. Это означает, что вы получаете OverflowException по умолчанию при переполнении, вместо того, чтобы среда выполнения молча усекала результат.

Возможно, вы захотите взглянуть на Как подавить проверку переполнения в PowerShell? для получения более подробной информации.

0 голосов
/ 07 мая 2019

Вы пытаетесь присвоить своему 16-битному целому числу число 101398986, это абсолютно невозможно, если вы используете 16-битные, потому что 16-битное целое число должно быть меньше или равно 65 535

Или если его целое число со знаком: -32,767 <число <32,767 </p>

Так что лучше использовать 32-битное целое для вашего случая:

var g = 101398986;
UInt32 v = (UInt32)g;

Где ваш номер должен быть меньше или равен 4294967295 (для 32-битного целого)

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