[ Shadowed @ 21.06.2012. 15:23 ] @
Da li je poznato nekom, postoji li neki smislen razlog zasto nisu omogucili nesto ovako?

Code (csharp):

var x = new { a = "a", b = () => { Console.WriteLine("b"); } };
 



Moze se izvesti vrlo slicna stvar sa:
Code (csharp):

var x = new { a = "a", b = new Action(() => { Console.WriteLine("b"); } };
 


Ali nije to to :)
[ Shadowed @ 21.06.2012. 15:34 ] @
Tj. mala izmena. Kapiram da bi i kada bi moglo ono prvo to opet bio property tipa Delegate (ili MulticastDelegate) a ne bi bio metod.
Tako bar ispadne kad uradim:

Code (csharp):

delegate void d();
static void Main(string[] args)
{
     d test = () => { Console.WriteLine("test"); };
     var x = new { a = "a", b = test };
}



Zbog toga, pitanje bi pre trebalo glasiti, zasto nije moguce:
Code (csharp):

var x = new (a = "a", void b() { Console.WriteLine("b"); });
 
[ Dejan Carić @ 21.06.2012. 16:14 ] @
http://blogs.msdn.com/b/ericlippert/contact.aspx

:)

http://stackoverflow.com/quest...ssigned-to-var/4966409#4966409

[Ovu poruku je menjao Dejan Carić dana 21.06.2012. u 17:27 GMT+1]
[ lukeguy @ 21.06.2012. 17:05 ] @
Već je odgovorio. ;)

http://stackoverflow.com/quest...ssigned-to-var/4966409#4966409
[ Shadowed @ 21.06.2012. 17:46 ] @
OK, shvatio sam i ja da ne moze da skapira koji je tip, otud ona druga poruka. I dalje mi nije jasno zasto nisu dozvolili nesto kao ono u mom poslednjem kodu. Takodje, imho, trebalo je i da dozvole odredjivanje tipa clana (string a = "a" umesto samo a = "a" u primeru koji sam dao).
[ mmix @ 21.06.2012. 21:22 ] @
Za to sto void b() nije delegat vec method implementation, kompajler moze da wrapuje metod impl u delegat kroz lambdu ili cak kroz dodelu u unapred poznati tip delegata ali ako se tip delegata ne zna onda se opet postavlja pitanje u koji delegat
[ Shadowed @ 21.06.2012. 21:34 ] @
Citat:
mmix: Za to sto void b() nije delegat vec method implementation

Pa da, i upravo method implementation i hocu a ne delegat. Tj. "hocu". Nije da mi ovo treba za nesto konkretno, nego mi palo na pamet i ono.. razmisljam zasto nisu napravili da to moze. Ne vidim neki razlog protiv (osim "moze sa delegatom pa nas mrzelo da pravimo i podrsku za prave funkcije" ).
[ Dejan Carić @ 21.06.2012. 23:42 ] @
Postoje dva tipa podataka koja možeš da koristiš kako property-e klase: value types i reference types.
Kada instanciraš klasu:
- možeš da dodeliš vrednost property-ima
- vrednost tih property-a se čuva negde

Odgovor na tvoje pitanje:
Delegat je referentni tip. Možeš da mu dodeliš vrednost koja će biti sačuvana negde u memoriji.
Kao što je Miljan rekao, void b() nije delegat već method implementation, tj. nije tip podataka (ne možeš da dodeliš vrednost, rezultat se ne čuva u memoriji).
[ mmix @ 22.06.2012. 00:50 ] @
Aaa, ok, sad kontam sta hoces, ti hoces da deklarises anonimnu klasu ali tako da sadrzi metode pored propertya. U teoriji mehanizam bi mogao da radi (ionako je implementacija takva da je a property sa private getterom, koji je zapravo glorifikovani metod).

Hmm, jedino ogranicenje koje vidim je sintaksa inicijalizatora

[Ovu poruku je menjao mmix dana 22.06.2012. u 02:03 GMT+1]
[ Shadowed @ 22.06.2012. 08:07 ] @
Dejane, shvatam ja to, pogledaj moju drugu poruku sa pocetka teme. Method implementation je zapravo prva stvar koju sam ja probao kada sam eksperimentisao pa sam posle dosao do delegata i onda pogresno to stavi ou prvu poruku.

Mmix, upravo tako. Stavise, ja bih dozvolio kompletnu definiciju klase kao kada pises "obicnu" klasu. Nesto kao:
Code (csharp):

var x = new
{
     private int a = 2;
     private int _b = 3;

     public int b { get { return _b; } }

     public bool IsBGraterThanA() { return (b > a); }
}
 


Mislim da bi CLR mogao to da svari i da je jedini razlog sto ne moze sto eto nisu dodali u sintaksu i kompajler.
[ Dejan Carić @ 22.06.2012. 10:26 ] @
Sorry, nisam dobro pročitao tvoju poslednju poruku :(

Citat:
Shadowed:razmisljam zasto nisu napravili da to moze. Ne vidim neki razlog protiv (osim "moze sa delegatom pa nas mrzelo da pravimo i podrsku za prave funkcije" :)).

Ovde je više stvar dizajna nego implementacije. Anonimni tipovi su dizajnirani kao privremeni objekti. Čak su im i svi property-i read-only.
Video sam da se koriste samo kada LINQ-om protrčiš kroz neku kolekciju, a dobijeni rezultat ispisuješ negde. Pa da ne bi pravio posebnu klasu koja predstavlja jedan item, jer ti treba samo privremeno (nećeš da ga keširaš ili pošalješ drugoj klasi/metodi), ti lepo napraviš anonimni tip i dobiješ intellisense podršku kod ispisa :)
Ili kada u MVC-u trebaš da vratiš JSON.

Sa implementacione strane gledišta, metoda bi mogla da se ugura u anonimni tip, ali koja je svrha/primena toga?
[ mmix @ 22.06.2012. 15:13 ] @
postoji moguca primena sa .NET4.0 i dynamic. Instanca anonymous tipa moze da se vrati kroz dynamic i onda njen metod moze da se pozove kroz runtime binding, jeza me prolazi od toga ali je moguce

Shadowed, ja licno mislim da su oni bili u fazonu, ako ti treba quick readonly container za neki short task onda anonymous type da ne moras da se smaras sa pravljenjem klasa, ako je u pitanju instanca sa funkcionalnom implementacijom onda napravi klasu LINQ podrzava inicijalizaciju deklarisanih klasa tako da nista posebno ne bi dobio sa ovim sem one grozote iz prve recenice Mozda ljudi jednostavno nisu zeleli da se C# pretvori u javascript
[ Shadowed @ 22.06.2012. 22:19 ] @
Meni je to najvise do kompletnosti. Ovako mi nekako izgleda polovicno uradjeno :) Jeste, znam, pomalo sam Monk :)

Citat:
mmix: Mozda ljudi jednostavno nisu zeleli da se C# pretvori u javascript :)

Uh, sad si me podsetio nekih stvari od pre 3god... Doduse, bio je ActionScript, al' dodje mu na isto. Mozda ipak bolje sto nema jer nekad moras da radis sa tudjim kodom... A sampiona nikad ne manjka...