C#->X# for dummies

This forum is meant for anything you would like to share with other visitors
User avatar
wriedmann
Posts: 3753
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

C#->X# for dummies

Post by wriedmann »

Hi Horst,
I don't think you need it since there should be an implicit conversion of the datatypes.
But this is a compiler thing and X# may behave differently than C#.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
robert
Posts: 4503
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

C#->X# for dummies

Post by robert »

Horst,
No. When you write

LOCAL amount AS decimal
amount := 100.25

Then the literal will be a double value or a float value (depending on the compiler option /vo14) and a runtime conversion to decimal will be done. 100.25m tells the compiler to use a literal with a decimal type.

Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
User avatar
Horst
Posts: 335
Joined: Tue Oct 13, 2015 3:27 pm

C#->X# for dummies

Post by Horst »

this error msg drives me crazy,

warning XS0618: 'QRCoder.PayloadGenerator.SwissQrCode.Contact.Contact(string, string, string, string, string, string)' is obsolete: 'This constructor is deprecated. Use WithStructuredAddress instead.' 58,3 Start.prg TestQRCode

i tried ->QRCoder.PayloadGenerator.SwissQrCode.Contact.WithStructuredAddress - like they do it in a c# testsample but in x# comes

error XS0426: The type name 'WithStructuredAddress' does not exist in the type 'QRCoder.PayloadGenerator.SwissQrCode.Contact' 58,3 Start.prg TestQRCode

C# Code
[Obsolete("This constructor is deprecated. Use WithStructuredAddress instead.")]
public Contact(string name, string zipCode, string city, string country, string street = null, string houseNumber = null) : this (name, zipCode, city, country, street, houseNumber, AddressType.StructuredAddress)
{
}
public static Contact WithStructuredAddress(string name, string zipCode, string city, string country, string street = null, string houseNumber = null)
{
return new Contact(name, zipCode, city, country, street, houseNumber, AddressType.StructuredAddress);
}

Horst
User avatar
robert
Posts: 4503
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

C#->X# for dummies

Post by robert »

Horst,

Do not use WithStructuredAddress{} (with curly braces) but WithStructuredAddress()(with parentheses).
This is a static method of the Contact class.

Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
User avatar
Horst
Posts: 335
Joined: Tue Oct 13, 2015 3:27 pm

C#->X# for dummies

Post by Horst »

Thanks Robert , its working with that.

my last error lol i hope so :-)

error XS0118: 'qrCode' is a variable but is used like a type 52,8 Start.prg TestQRCode

LOCAL qrCodeData AS QRCodeData
LOCAL qrCode AS QRCode

qrCodeData := qrGenerator:CreateQrCode(payload, QRCodeGenerator.ECCLevel.M)
//Rohdaten-QR-Code erzeugen
qrCode := QRCode {qrCodeData}

QRCode is a class:
namespace QRCoder
{
public class QRCode : AbstractQRCode, IDisposable
{
/// <summary>
/// Constructor without params to be used in COM Objects connections
/// </summary>
public QRCode() { }

public QRCode(QRCodeData data) : base(data) {}

i dont know why X# is complaining ,

Horst
User avatar
Fabrice
Posts: 457
Joined: Thu Oct 08, 2015 7:47 am
Location: France

C#->X# for dummies

Post by Fabrice »

Hi Horst,

please find attached a solution with :
A sample coming from GitHub in CSharp
The same, moved to X#, using ILSpy

Both are using the NuGet package of QRCoder.

HTH,
Fab
Attachments
QRCodeTest.zip
(8.12 KiB) Downloaded 69 times
XSharp Development Team
fabrice(at)xsharp.eu
User avatar
Chris
Posts: 4878
Joined: Thu Oct 08, 2015 7:48 am
Location: Greece

C#->X# for dummies

Post by Chris »

Hi Horst,

For which line do you get the error?

The one you posted should be working correctly, although I would suggest using a different variable name for the local, because right now it's the same as the type. I would suggest changing it to "LOCAL oQRCode AS QRCode" or something similar. Remember that c# is case-sensitive, while X# by default isn't, although you can enable the /cs compiler option and make it case sensitive as well.
Chris Pyrgas

XSharp Development Team
chris(at)xsharp.eu
User avatar
Horst
Posts: 335
Joined: Tue Oct 13, 2015 3:27 pm

C#->X# for dummies

Post by Horst »

Hi Chris , hi Fabrice

Fabrice thanks, with your hint (Nuget), i was able to make the X# Code runing with the Nuget dll. then i was on GitHub again, but i did not find the c# sample you put into the zip

Chris, I was also looking inside the dll's with ILSpy and i found out, the class QRCoder is not inside the dll i was compiling with the c# source.

my prg is working now, but only with a dll without sourcecode and i hate that :-)

Thanks your the help, maybe later i will try to fix the c# code

Horst

Attached the Prg incl. dll
Attachments
SwissQRCode.ZIP
(54.66 KiB) Downloaded 71 times
User avatar
Fabrice
Posts: 457
Joined: Thu Oct 08, 2015 7:47 am
Location: France

C#->X# for dummies

Post by Fabrice »

Horst,
the sample comes from here :
https://github.com/codebude/QRCoder/wik ... -iso-20022
I've just changed the IBan Type, to have something that was "correct"; I have removed the RedCross background, and saved the image to check the generated QRCode with my smartphone.

That said, the NuGet package is 3 months old, where the GitHub source is also 3 months old; I suspect they are the same.

HTH,
Fab
XSharp Development Team
fabrice(at)xsharp.eu
User avatar
Chris
Posts: 4878
Joined: Thu Oct 08, 2015 7:48 am
Location: Greece

C#->X# for dummies

Post by Chris »

Hi Hirst,
Horst wrote: Chris, I was also looking inside the dll's with ILSpy and i found out, the class QRCoder is not inside the dll i was compiling with the c# source.
my prg is working now, but only with a dll without sourcecode and i hate that :-)
That's true, there is no class named "QRCoder" in the code, and neither exists one in the dll you are using.

What does exist, is a namespace named "QRCoder", and there are several classes which have that same namespace. Those are the classes "QRCoder.AbstractQRCode", "QRCoder.AsciiQRCode", "QRCoder.PayloadGenerator" and all the rest you see with ILSpy, but there's no class named simply "QRCoder" indeed. Edit: Oh, there's even a class named "QRCoder.QRCode"!!! Note that in the above class names, by convention we call the first part of the name before the dot as "namespace" and the rest as the "short class name", but in truth the whole thing is what consists the full/real class name.

In addition to that, one of those classes, the class "QRCoder.PayloadGenerator" has a (actually it has a lot) nested class (a class that is defined inside another class definition, with a short name "SwissQrCode". This class, because is a nested class, "inherits" the name of its containing class, resulting to a full name "QRCoder.PayloadGenerator.SwissQrCode". This name has three parts, the namespace, the short class name of the container class and the nested class. And this is the class that you needed to use in your code.

I know, this is very confusing, and that's because of an extremely bizarre (to me) decision by the c# designers to use the dot operator for almost everything in this language...for namespaces, classnames, nested classes, members of the classes, everything! And this makes it very difficult to distinguish what is what when you see code like that, but with (very :)) careful reading, you can figure them out at the end.
Chris Pyrgas

XSharp Development Team
chris(at)xsharp.eu
Post Reply