Avatar billede olehaahr Nybegynder
03. februar 2012 - 12:10 Der er 3 kommentarer og
1 løsning

Custom datatyper i C#

Hej,

Jeg vil gerne oprette mine egne datatyper i c#.
Jvf. nedenstående link skulle det være nemt nok.

http://vbcity.com/blogs/jatkinson/archive/2010/01/12/create-custom-types-and-initialize-them-without-the-new-keyword-c-vb-net.aspx

Men det virker ikke. Jeg får følgende fejl:

A field initializer cannot reference the non-static field, method, or property 'WindowsFormsApplication1.minklasse.anotherAngle'   

Hvad gør jeg galt ?

Mvh Ole

Her er min kode:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    struct Angle
    {
        // Private constructor called by [implicit operator Angle(...)]
        private Angle(double value)
        {
            // Limiting an angle to the values between -360 and 360 degrees.
            if (value < 360 && value > -360)
            {
                this._angle = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("value", "variable value must be between -360 and 360 degrees.");
            }
        }

        // Holds an internal value of the angle.
        private double _angle;

        // Here we can initialize a new "Angle" without a constructor.
        public static implicit operator Angle(double value)
        {
            return new Angle(value);
        }

        // Define the "+" behavior.
        public static Angle operator +(Angle a1, Angle a2)
        {
            double temp = a1._angle + a2._angle;
            // Check to see if the addition of two angles is too large
            // to fit in out Angle data type.
            if (temp < 360 && temp > -360)
            {
                return new Angle(temp);
            }
            else
            {
                throw new ArithmeticException();
            }
        }

        // Define "-" behavior.
        public static Angle operator -(Angle a1, Angle a2)
        {
            return new Angle(a1._angle - a2._angle);
        }

        // Type conversions

        // Angle myAngle = 123.45;
        // double d = myAngle;
        public static implicit operator double(Angle value)
        {
            return value._angle;
        }

        // Angle myAngle = 123.45;
        // float f = (float)myAngle;
        public static explicit operator float(Angle value)
        {
            return (float)value._angle;
        }

        // Angle myAngle = 123.45;
        // int i = (int)myAngle;
        public static explicit operator int(Angle value)
        {
            return (int)value._angle;
        }

        public override string ToString()
        {
            return _angle.ToString();
        }
    }

    class minklasse
    {
        // Assignment - virker
        Angle myAngle = 1.23;
        Angle anotherAngle = 90.00;

       
        // Math operations - ingen af disse virker...
        Angle addedAngle = myAngle + anotherAngle;
        Angle KopiAngle = myAngle;
        Angle subtractAngle = myAngle - anotherAngle;
    }
}
Avatar billede Tylon_Foxx Nybegynder
03. februar 2012 - 13:21 #1
En af dine static metoder skal ikke være static... umiddelbart tror jeg det er den statiske metode med "+" behavior...

hvilken .NET version compiler du med... hvis det er .NET 4.0 kan der sagtens være noget der er lavet om så koden ikke virker som den skal... langt det meste er som regel skrevet i enten 2.0 eller 3.0, så tjek din .NET version allerførst (højreklik på projektet > properties).
Avatar billede bvli Praktikant
03. februar 2012 - 14:19 #2
Den er godt nok også drilagtig.

Alle dine statement bliver jo reelt kørt i constructoren til din klasse (og det giver jo reelt ingen mening). Men på en eller anden måde, fatter compileren så ikke, at du har lavet en implicit cast af myAngle (vi kan altid diskutere om det er fedt at lave implicitte casts).

følgende vil virke:

    class minklasse
    {
        // Assignment - virker
        Angle myAngle = 1.23;
        Angle anotherAngle = 90.00;

     
        // Math operations - ingen af disse virker...
//        Angle addedAngle = myAngle + anotherAngle;
//        Angle KopiAngle = myAngle;
//        Angle subtractAngle = myAngle - anotherAngle;
         
          static void Main()
          {
            minklasse m = new minklasse();
            Angle addedAngle = m.myAngle + m.anotherAngle;
            Angle KopiAngle = m.myAngle;
            Angle subtractAngle = m.myAngle - m.anotherAngle;
          }
Avatar billede olehaahr Nybegynder
03. februar 2012 - 14:42 #3
Tak til bvli.
Du har helt ret.

Til brug for andre er her lige dette stykke kode, som viser hvad jeg egentlig ville gøre.

using System;
using System.Collections.Generic;
using System.Text;

namespace Project1
{
    struct Varenummer
    {
        private string _varenummer;

        private Varenummer(String in_varenummer)
        {
            _varenummer = in_varenummer;
        }

        public implicit operator Varenummer(String in_varenummer)
        {
            return new Varenummer(in_varenummer);
        }
   
        public override string ToString()
        {
            return _varenummer.ToString();
        }


    }

    class MinKlasse
    {
       
        Varenummer a;
        Varenummer b;

        public void test()
        {
            a = "1234";
            b = "5678";
            a = b;
        }
 
    }
}
Avatar billede bvli Praktikant
03. februar 2012 - 15:19 #4
Så lægger jeg et svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester