oleg-shilo/cs-script

Looks like the csscript doesn't like LINQ or LINQtoXML -> 3.50.5.1 CS-Script.bin

Closed this issue · 1 comments

Hi,

currently playing with .Net-Framework 4.7.2

encountered some issues with the csscript.
most of them are solved, like the "auto-discards" in 623-625 and "checkForNull" in 896 just by writing it the long way :-)

But unfortunately I cannot solve the LINQtoXML-Part to easy 457-463

I've got the 3.50.5.1 (Nuget) installed, because I'm using .Net-Framework.

Would be great to hear back.
Best Regards

`
using System;
using System.Text;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Xml.Linq;

457 var infoTags = from info in xDocument.Descendants("info")
458 let description = info.Element("description")?.Value
459 select new
460 {
461 Name = info.Element("name")?.Value,
462 Description = description,
463 Type = GetDescriptionType(description)
463 };

c:...\bin\Release\data.tmp(458,61): error CS1525: Invalid expression term '.'
c:...\bin\Release\data.tmp(458,62): error CS1003: Syntax error, ':' expected
c:...\bin\Release\data.tmp(459,22): error CS1002: ; expected
c:...\bin\Release\data.tmp(461,45): error CS1525: Invalid expression term '.'
c:...\bin\Release\data.tmp(461,46): error CS1003: Syntax error, ':' expected

621 static Type GetDescriptionType(string description)
622 {
623 if (bool.TryParse(description, out _)) return typeof(bool);
624 if (int.TryParse(description, out _)) return typeof(int);
625 if (float.TryParse(description, out _)) return typeof(float);
626 return typeof(string);
627 }

c:...\bin\Release\data.tmp(623,40): error CS0103: The name '_' does not exist in the current context
c:...\bin\Release\data.tmp(623,9): error CS1502: The best overloaded method match for 'bool.TryParse(string, out bool)' has some invalid arguments
c:...\bin\Release\data.tmp(623,40): error CS1503: Argument 2: cannot convert from 'out ' to 'out bool'
c:...\bin\Release\data.tmp(624,39): error CS0103: The name '
' does not exist in the current context
c:...\bin\Release\data.tmp(624,9): error CS1502: The best overloaded method match for 'int.TryParse(string, out int)' has some invalid arguments
c:...\bin\Release\data.tmp(624,39): error CS1503: Argument 2: cannot convert from 'out ' to 'out int'
c:...\bin\Release\data.tmp(625,41): error CS0103: The name '
' does not exist in the current context
c:...\bin\Release\data.tmp(625,9): error CS1502: The best overloaded method match for 'float.TryParse(string, out float)' has some invalid arguments
c:...\bin\Release\data.tmp(625,41): error CS1503: Argument 2: cannot convert from 'out _' to 'out float'

896 Write?.Invoke("Could not ClearProcessData on OPC" + e.Message);
c:...\bin\Release\data.tmp(896,13): error CS1525: Invalid expression term '.'
c:...\bin\Release\data.tmp(896,14): error CS1003: Syntax error, ':' expected
`

The problem is caused by the fact that you are using the null-conditional operator ?., which is not supported by .NET Framework compilers out of the box but by Roslyn only.

You have a few options here:

  • Drop the operator and use more verbose syntax
    let description = info.Element("description") == null ? null : info.Element("description").Value
  • Use Roslyn-based CodeProvider. You will need to configure your cscs.exe to use the CSSRoslynProvider.dll compiler. Or just place CSSRoslynProvider.dll file in the same folder with cscs.exe. Though it may also be too old to support this syntax.
  • Switch to the latest CS-Script version that is .NET Core-based. It supports the latest C# syntax right away.