Oprettet fre. d. 25. juni 2010 kl. 15:00:30

boomshanka
boomshanka (18.388 point. Point ude: 30)

Hvorfor skal jeg oprette referencer til typer brugt i andre constructors?

Hej eksperter,

Jeg har en klasse (A.cs) som kalder en af 3 constructors i en anden klasse (B.cs). De 2 øvrige constructors i B.cs er en tom constructor og en constructor som tager en parameter af typen C.cs sådan:

public class A
{
public void CallBConstructor()
{
using(B myB = new B("mystring"))
{
...
}
}
}

public class B
{
public B(){}
public B(string myString){}
public B(C myC){}
}

public class C
{
}


Alle 3 klasser ligger i hvert sit assembly. Det jeg ikke forstår er at hvis jeg i CallBConstructor kalder default constructor B() så kompilere det fint, men hvis jeg kalder B("mystring") får jeg en kopilerfejl om at jeg skal tilføje [Namespace].C som reference i A.cs. Mit spørgsmål er nu hvorfor i alverden jeg er tvunget til at tilføje en reference til en parametertype som bliver brugt i en constructor jeg slet ikke kalder!? Hvad nu hvis C.cs lå i et assembly som ikke lige var til at få fat på?

Skrevet fre. d. 25. juni 2010 kl. 15:56:42| #1

arne_v
arne_v (1.005.623 point)
Jeg kan genskabe problemet.

Og det er et godt spoergsmaal.

Hvis jeg skal gaette saa er forklaringen:
- C# understoetter overload
- ogsaa af constructor
- et faktisk argument til en overloaded metode kan godt matche flere forskellige overloads
- reglen siger saa at der skal vaelges den mest specifikke klasse

Eksempel:

public class B
{
  public B(C myC){}
  public B(SubC myC){}
}

public class C
{
}

public class SubC : C
{
}

og et kald:

new B(new SubC())

vil bruge den sidste.

Mit gaet er at naar du kalder en constructor med et argument, saa skal C# comoileren have fat i all constructorer med et argument for at teste hvilken af dem der matcher bedst med dit argument.

Og den test goer det noedvendigt at kigge lidt paa typerne af parametre.

Hvis nu C var en superklasse for string, saa kunne den jo matche.

Skrevet man. d. 28. juni 2010 kl. 13:06:00| #2

boomshanka
boomshanka (18.388 point)
Tror du har ret arne_v - en kollega henviste mig til C# Language Specification sektion 7.4.1 (http://msdn.microsoft.com/ (...)(v=VS.71).aspx) som blandt andet har følgende at sige omkring "method invocation":

...During the run-time processing of a function member invocation (Section 7.4.3), the expressions or variable references of an argument list are evaluated in order, from left to right, as follows:

- For a value parameter, the argument expression is evaluated and an implicit conversion (Section 6.1) to the corresponding parameter type is performed...


Læser man lidt mellem linjerne kunne det godt forklare hvorfor fejlen opstår, men jeg er stadig ikke helt overbevist. Ifølge specifikationen gælder det kun for value types mens jeg i mit eksempel bruger reference types.

Skrevet man. d. 28. juni 2010 kl. 15:34:56| #3

arne_v
arne_v (1.005.623 point)
Det er så runtime. Dit problem er jo compile time. Så det er ikke helt det samme.

Skrevet søn. d. 25. juli 2010 kl. 22:51:01| #4

arne_v
arne_v (1.005.623 point)
all set?

Skrevet tor. d. 02. september 2010 kl. 13:27:28| #5

boomshanka
boomshanka (18.388 point)
Jeg må indrømme jeg ikke er kommet tættere på en egentlig forklaring af problemet. Indtil nu har folk kun kunne gætte sig til hvad der sker.

Jeg smider lidt flere kræfter efter den før jeg lukker den.

Skrevet tor. d. 02. september 2010 kl. 14:57:17| #6

boomshanka
boomshanka (18.388 point)
Så kom svaret på stackoverflow:

http://stackoverflow.com/ (...)

Som du skriver skal C# kunne læse typen af C for at kunne vælge den rigtige constructor. Det er ikke noget jeg før har tænkt over, men det er da værd at overveje når man designer sine klasser.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Koordinater for nyt vindue efter scroll, csharp.

Oprettet den 11. februar 2012 kl. 01.54
bjarnefilm giver 30 point for svar | Giv et svar »

Treeview hovedmenu á lá Dynamics C5

Oprettet den 10. februar 2012 kl. 08.12
olehaahr giver 30 point for svar | Giv et svar »

Deployment på Windows Mobile 6.5

Oprettet den 9. februar 2012 kl. 13.59
schristensen giver 200 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger