\

Školení Návrhové vzory, OOP a UML


 Sunday, July 09, 2006
Chyba ve VS.NET 2005?
Chyba vulgo Bug

Včera a dneska jsem narazil na jedno "omezení-chybu" VS.NET 2005. Vždy, když jsem se snažil zkompilovat projekt, jsem dostal ve VS.NET pouze hlášku.

"An error has occured which the C# compiler is unable to report due to low memory or possible heap corruption. It is recommended that you save all your files, close and restart Visual Studio"

Restart VS.NET ale nezabral a dokonce ani nepomohl jindy všemocný restart počítače - měl jsem podezření, že po opakované hibernaci  notebooku, která ve Windows XP na počítačích s více než jedním GB paměti není ani zdaleka dokonalá, má problémy VS.NET se správou paměti přesně tak, jak se snaží reportovat v chybové zprávě.

Zkusil jsem projekt zkompilovat v příkazovém řádku:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt
 /warn:4 /define:DEBUG;TRACE /reference:"C:\Documents and Settings\Rene\My Documents\Visual Studio 2005\Projects\RStein.RS\RStein.RS\RStein.RS.DataStorage\bin\Debug\RStein.RS.DataStorage.dll"
 /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
\System.configuration.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug+ /debug:full /optimize- /out:obj\Debug\RStein.RS.BusinessEntities.dll /target:library Articles\Article.cs
Articles\ArticleCategory.cs Articles\ArticleChapter.cs Articles\ArticleKeyword.cs
Articles\ArticlePhotoCategory.cs Articles\ArticleSerial.cs Articles\ArticleState.cs Task.cs Articles\ArticleTheme.cs Attachment.cs AttachmenType.cs Collections\ArticleCategoryCollection.cs
Collections\ArticleChapterCollection.cs Collections\TaskCollection.cs Collections\ArticleThemeCollection.cs Collections\BusinessCollectionBase.cs
Collections\CollectionChangeEventArgs.cs Collections\HWInformationTypeCollection.cs
 CommonInterfaces\IUIDataProvider.cs Helpers\BasicValidations.cs BusinessObjectBase.cs Category.cs
Collections\AttachmentCollection.cs Collections\CategoryCollection.cs Collections\DeviceInfoCollection.cs Collections\ObservationCollection.cs Helpers\CentralConfigData.cs
Helpers\GlobalConstants.cs Helpers\IdentityMap.cs HWInformationDataType.cs DeviceInfo.cs
Helpers\DataCacheHelper.cs Observation.cs CodeTableBase.cs
Collections\HWCategoryCollection.cs HWCategory.cs
HWInformationType.cs Language.cs Measurement.cs
Properties\AssemblyInfo.cs
CategoryObservation.cs Quantity.cs Unit.cs UnitType.cs UrlAttachment.cs

A zjistil jsem, že VS.NET svádí na kompilátor C# chybu, se kterou si nedokáže poradit samo. Kompilátor totiž bez reptání nareportoval chybu ve zdrojovém kódu.

Collections\TaskCollection.cs(10,18): error CS0309: The type
        'RStein.RS.BusinessEntities.Task' must be convertible to
        'RStein.RS.BusinessEntities.BusinessObjectBase' in order to use it as
        parameter 'T' in the generic type or method
        'RStein.RS.BusinessEntities.BusinessCollectionBase<T>'
Collections\BusinessCollectionBase.cs(8,18): (Location of symbol related to
        previous error)
Task.cs(7,18): (Location of symbol related to previous error)

 

VS.NET si tedy evidentně neumí vypořádat s touto kombinací:

Máte bázovou třídu pro typové kolekce s generickým typem T, u kterého vyžaduji, že musí být potomkem třídy BussinessObjectBase.

 

public class BusinessCollectionBase<T> : Collection<T> 
                                        where T : BusinessObjectBase
    {
    }
 

Dále máte odvozenou typovou kolekci pro business objekt - např. pro třídu Task.

 

public class TaskCollection : BusinessCollectionBase<Task>

{

}

A Třída Task není potomkem třídy BusinessObjectBase.

public class Task
    {
    }

 

Poté dostanete ve VS.NET výše uvedenou docela zmatečnou hlášku.

Stačí doplnit bázovou třídu BusinessObjectBase k třídě Task a kompilace i ve VS.NET proběhne tak jak má.

public class Task : BusinessObjectBase
    {
    }

Můžete prosím někdo toto chování ověřit na svém počítači, abych mohl zaměstnat Lady Bug Microsoftu? :) Díky.



Sunday, July 09, 2006 4:43:43 PM (Central Europe Standard Time, UTC+01:00)       
Comments [10]  .NET Framework


Sunday, July 09, 2006 5:11:13 PM (Central Europe Standard Time, UTC+01:00)
Ahoj
nasimuloval som si to presne ako si popisoval, a chybu ktoru tebe vyhodil kompilator az pri rucnom sposobe kompilacie mne vyhodilo priamo Visual Studio v Error Liste, teda:
Error 1 The type 'GenericBug.Task' must be convertible to 'GenericBug.BusinessObjectBase' in order to use it as parameter 'T' in the generic type or method 'GenericBug.BusinessCollectionBase<T>' G:\work\_temp\GenericBug\GenericBug\TaskCollection.cs 7 18 GenericBug

Mam VS2005 Prof. Edition
a .NET FW 2.05027
Sunday, July 09, 2006 5:12:36 PM (Central Europe Standard Time, UTC+01:00)
Este detail, RAM mam iba 0.99 GB...a Win XP Prof, EN :)
Sunday, July 09, 2006 5:14:39 PM (Central Europe Standard Time, UTC+01:00)
Ahoj René,
tak jsem zkusil zmíněný případ na svém pc a vše se chová korektně. Tedy VS.NET 2005 vygeneruje správnou chybovou hlášku "The type xxx must be convertible to ...".
Ještě přidám, že je to systém WinXP (též hibernuji), 1GB RAM, dualcore. V solution, ve kterém jsem to zkoušel je více projektů.
Pěkný den Jarda
Sunday, July 09, 2006 5:15:40 PM (Central Europe Standard Time, UTC+01:00)
Ahoj, diky za vyzkouseni - tak tady bude asi pusobit jeste nejaky jiny faktor. Ja mam prave RAM 1,5 GB
OS - Windows XP Professional se vsemi zaplatami
VS.NET 2005 a stejny .NET Framework.
Na pocitaci mam tedy jeste DLINQ, ATLAS, WCF, WPF, WWF.


Sunday, July 09, 2006 5:17:20 PM (Central Europe Standard Time, UTC+01:00)
Jarda Jirava: Hm, tak to je divny - ja to na svem projektu nasimuluji kdykoli.
Zkusim jeste jiny projekt.
Taky diky za vyzkouseni.
Sunday, July 09, 2006 5:20:42 PM (Central Europe Standard Time, UTC+01:00)
Jeste snad pro jistotu - v notebooku mam Turiona 64bit

(presne AMD Turion 64 MT-32 mobile
FSB 200Mhz, násobitel 9x = 1800MHz
L1 cache = 64K
L2 cache = 512K)
Monday, July 10, 2006 9:56:03 AM (Central Europe Standard Time, UTC+01:00)
U mna to tiez vypisuje spravnu chybu. NB ACER 4651, 2GB RAM. VS.Net 2005 Pro. Tak Ti asi instalaciu pokazilo nieco z doinstalovanych veci, mozno ;)
Monday, July 10, 2006 10:02:32 AM (Central Europe Standard Time, UTC+01:00)
Tak ta chyba bude zaludnejsi - na jinem (novem) projektu se VS.NET chova normalne, popisovane chovani nastane jen u tohoto projektu (ktery uz je docela slozity a generiku intenzivne pouziva).

Mofko: Diky za dalsi test :)
Monday, July 10, 2006 10:18:48 AM (Central Europe Standard Time, UTC+01:00)
A zkoušel jsi projekt zkompilovat pomocí MSBuildu? Vrazit mu přímo Solution, jako to dělá Studio...
Monday, July 10, 2006 4:16:57 PM (Central Europe Standard Time, UTC+01:00)
Rarous:
Ahoj Alesi, msbuild se zachova normalne - to znamena, ze vypise chybu z kompilatoru...
Comments are closed.