Запрещены неявные преобразования из real в decimal и из short в decimal как в C#
This commit is contained in:
miks1965 2018-07-22 01:24:48 +03:00
parent 742e6aa243
commit da8b1e671c
9 changed files with 49 additions and 13 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "4";
public const string Build = "0";
public const string Revision = "1716";
public const string Revision = "1719";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=4
%REVISION%=1716
%COREVERSION%=0
%REVISION%=1719
%MINOR%=4
%MAJOR%=3

View file

@ -1 +1 @@
!define VERSION '3.4.0.1716'
!define VERSION '3.4.0.1719'

View file

@ -1475,6 +1475,8 @@ function StrToInt(s: string): integer;
function StrToInt64(s: string): int64;
/// Преобразует строковое представление вещественного числа к числовому значению
function StrToFloat(s: string): real;
/// Преобразует строковое представление вещественного числа к числовому значению
function StrToReal(s: string): real;
/// Преобразует строковое представление s целого числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToInt(s: string; var value: integer): boolean;
@ -1487,6 +1489,12 @@ function TryStrToFloat(s: string; var value: real): boolean;
/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToFloat(s: string; var value: single): boolean;
/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToReal(s: string; var value: real): boolean;
/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToSingle(s: string; var value: single): boolean;
/// Считывает целое из строки начиная с позиции from и устанавливает from за считанным значением
function ReadIntegerFromString(s: string; var from: integer): integer;
/// Считывает вещественное из строки начиная с позиции from и устанавливает from за считанным значением
@ -7789,6 +7797,8 @@ begin
Result := Convert.ToDouble(s, nfi);
end;
function StrToReal(s: string) := StrToFloat(s);
function TryStrToInt64(s: string; var value: int64): boolean;
begin
Result := int64.TryParse(s, value);
@ -7816,6 +7826,9 @@ begin
end;
end;
function TryStrToReal(s: string; var value: real) := TryStrToFloat(s, value);
function TryStrToSingle(s: string; var value: single) := TryStrToFloat(s, value);
function ReadIntegerFromString(s: string; var from: integer): integer;
begin
while (from <= s.Length) and char.IsWhiteSpace(s[from]) do

View file

@ -1295,7 +1295,7 @@ type
SequenceAnimation = class(CompositeAnimation)
public
function Duration: real; override := ll.Sum(l -> l.Duration);
function Duration: real; override := ll.Select(l -> l.Duration).Sum;
function Add(b: MyAnimation): SequenceAnimation;
begin
ll += b;

View file

@ -2020,12 +2020,22 @@ namespace PascalABCCompiler.SystemLibrary
string[] s=new string[0];
_array_of_string = compiled_type_node.get_type_node(s.GetType());
make_type_conversion_use_ctor(_float_type, _decimal_type, type_compare.less_type, true);
make_type_conversion_use_ctor(_double_type, _decimal_type, type_compare.less_type, true);
//это преобразование есть явно в decimal
//это преобразование есть явно в decimal - это уже давно было закомментировано
//make_type_conversion_use_ctor(_integer_type, _decimal_type, type_compare.less_type, true);
make_type_conversion_use_ctor(_uint_type, _decimal_type, type_compare.less_type, true);
make_type_conversion_use_ctor(_uint64_type, _decimal_type, type_compare.less_type, true);
//make_type_conversion_use_ctor(_float_type, _decimal_type, type_compare.less_type, true);
//make_type_conversion_use_ctor(_double_type, _decimal_type, type_compare.less_type, true);
//make_type_conversion_use_ctor(_uint_type, _decimal_type, type_compare.less_type, true);
//make_type_conversion_use_ctor(_uint64_type, _decimal_type, type_compare.less_type, true);
// SSM 21.07.18 закомментировал четыре строчки выше, т.к. они давали неоднозначность при decimal(2.5).
// Теперь из real в decimal и из single в decimal возможно только явное преобразование
// Из longword в decimal и из uint64 в decimal существуют как явное, так и неявное преобразованя
// Это полностью соответствует тому, что в C#
// забавно, но make_type_conversion_use_ctor используется ТОЛЬКО тут и ТОЛЬКО для типа decimal !!!!!!!
// То есть, это было неправильное исправление
writable_in_typed_files_types.Clear();
writable_in_typed_files_types.Add(_bool_type, _bool_type);

View file

@ -1295,7 +1295,7 @@ type
SequenceAnimation = class(CompositeAnimation)
public
function Duration: real; override := ll.Sum(l -> l.Duration);
function Duration: real; override := ll.Select(l -> l.Duration).Sum;
function Add(b: MyAnimation): SequenceAnimation;
begin
ll += b;

View file

@ -1471,7 +1471,7 @@ public
/// --- SystemKeyEvents
procedure SystemOnKeyDown(sender: Object; e: System.Windows.Input.KeyEventArgs);
(*procedure SystemOnKeyDown(sender: Object; e: System.Windows.Input.KeyEventArgs);
begin
if GraphWPF.OnKeyDown <> nil then
GraphWPF.OnKeyDown(e.Key);
@ -1520,7 +1520,7 @@ public
mb := 2;
if GraphWPF.OnMouseMove <> nil then
GraphWPF.OnMouseMove(p.x, p.y, mb);
end;
end;*)
end;

View file

@ -1475,6 +1475,8 @@ function StrToInt(s: string): integer;
function StrToInt64(s: string): int64;
/// Преобразует строковое представление вещественного числа к числовому значению
function StrToFloat(s: string): real;
/// Преобразует строковое представление вещественного числа к числовому значению
function StrToReal(s: string): real;
/// Преобразует строковое представление s целого числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToInt(s: string; var value: integer): boolean;
@ -1487,6 +1489,12 @@ function TryStrToFloat(s: string; var value: real): boolean;
/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToFloat(s: string; var value: single): boolean;
/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToReal(s: string; var value: real): boolean;
/// Преобразует строковое представление s вещественного числа к числовому значению и записывает его в value.
///При невозможности преобразования возвращается False
function TryStrToSingle(s: string; var value: single): boolean;
/// Считывает целое из строки начиная с позиции from и устанавливает from за считанным значением
function ReadIntegerFromString(s: string; var from: integer): integer;
/// Считывает вещественное из строки начиная с позиции from и устанавливает from за считанным значением
@ -7789,6 +7797,8 @@ begin
Result := Convert.ToDouble(s, nfi);
end;
function StrToReal(s: string) := StrToFloat(s);
function TryStrToInt64(s: string; var value: int64): boolean;
begin
Result := int64.TryParse(s, value);
@ -7816,6 +7826,9 @@ begin
end;
end;
function TryStrToReal(s: string; var value: real) := TryStrToFloat(s, value);
function TryStrToSingle(s: string; var value: single) := TryStrToFloat(s, value);
function ReadIntegerFromString(s: string; var from: integer): integer;
begin
while (from <= s.Length) and char.IsWhiteSpace(s[from]) do