Haan schreef op maandag 21 maart 2011 @ 13:15:
[...]
Dat werkt echter niet, want ten eerste kan je geen private property buiten een class aanroepen en ten tweede zou de property static moeten zijn om op die manier aan te roepen.
oops, idd. Ik wou eigenlijk een member definieren welke je via een instance kon aanspreken.
C#:
1
2
3
4
5
6
7
| public class MeClass
{
public SomeClass val {get;set;}
}
MeClass m = new MeClass();
m.val = new SomeClass(); |
Woy schreef op maandag 21 maart 2011 @ 13:34:
Maar jouw voorstel was dat je een lvalue terug geeft waar je de assigment operator van gebruikt. Aangezien je geen invloed hebt op de assignemt in C# is jouw voorstel dus niet mogelijk, aangezien je de assignment operator niet kunt overloaden, en je dus alleen kunt assignen aan variabelen.
Ahhh, vermits a[2] geen variable is kan het niet.
MSDN praat over "storage location"
http://msdn.microsoft.com/en-us/library/sbkb459w.aspx ipv variable, zowat hetzelfde als C++. a[2] heeft echter ook een storage location.
In de spec wordt storage location niet gedefinieerd. (
http://download.microsoft...guage%20Specification.doc) Maar de definitie van een assignment is wel iets anders in de spec "The left operand of an assignment must be an expression classified as a variable, a property access, an indexer access, or an event access."
Zoals Woy schreef, bedankt!
Maar een array access geeft wel een variable terug: "The result of evaluating an array access is a variable of the element type of the array, namely the array element selected by the value(s) of the expression(s) in the expression-list." (echter operator[] != array access)
Nog iets leuk:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| struct Point
{
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int X {
get { return x; }
set { x = value; }
}
public int Y {
get { return y; }
set { y = value; }
}
}
struct Rectangle
{
Point a, b;
public Rectangle(Point a, Point b) {
this.a = a;
this.b = b;
}
public Point A {
get { return a; }
set { a = value; }
}
public Point B {
get { return b; }
set { b = value; }
}
}
Point p = new Point();
p.X = 100; //valid
p.Y = 100; //valid
Rectangle r = new Rectangle();
r.A.X = 10; //invalid
r.A.Y = 10;//invalid
r.B.X = 100;//invalid
r.B.Y = 100;//invalid |
r is een variable. r.A is dat niet.
[edit]
Woy schreef op maandag 21 maart 2011 @ 13:34:
Maar wat ik me eigenlijk afvraag is waarom je dit op deze manier zou willen doen. Ik vind de oplossing zoals die in C# gekozen is eigenlijk een stuk duidelijker dan de manier waarop je het in C++ zou doen.
Omdat ik verschil van mening op je laatste zin. Maar omdat ik geen C# ervaring heb kan ik me beter onthouden van commentaar.
Ik bekeek het ook alleen vanuit het oogpunt van het ontwerp van de taal. En operator overloading arbitrair beperken en de this [] in het leven roepen om toch maar het equivalent te kunnen bieden is een (elegant) ontwerp complex maken(verprutsen). Maar ook variable assignment steekt een stok in de wielen dus.
[
Voor 12% gewijzigd door
Punkie op 21-03-2011 15:00
]