Hieronder een stukje testcode dat dezelfde error produceert als mn gegeneerde code. Het gaat om de regel onder *COMPILERERROR*. Aldaar krijg ik de error:
Op zich snap ik totaal niet waarom de error wordt gegeven, omdat .ToString() een string teruggeeft en deze dus gewoon aan de constante string moet plakken. Ergo: kan iemand wellicht meer duidelijkheid verschaffen?
ps: ik weet dat een protected property het oplost. Echter dat zou net zo fout moeten zijn icm met die .ToString(). Wellicht een bug in de Compiler, of een misverstand aan mijn kant.
Deze error krijg ik NIET, wanneer ik .ToString() weghaal. Ook als ik de base class niet laat deriven van ServicedComponent, krijg ik de error niet wanneer ik .ToString() specificeer.C:\Myprojects\VS.NET Projects\csctst\Class1.cs(35): Cannot pass 'csctst.Foo.m_iErrorCode' as ref or out, because
'csctst.Foo.m_iErrorCode' is a marshal-by-reference class
Op zich snap ik totaal niet waarom de error wordt gegeven, omdat .ToString() een string teruggeeft en deze dus gewoon aan de constante string moet plakken. Ergo: kan iemand wellicht meer duidelijkheid verschaffen?
ps: ik weet dat een protected property het oplost. Echter dat zou net zo fout moeten zijn icm met die .ToString(). Wellicht een bug in de Compiler, of een misverstand aan mijn kant.
code:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| using System;
using System.EnterpriseServices;
namespace csctst
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Foo : ServicedComponent
{
protected int m_iErrorCode;
public Foo()
{
// nothing
}
}
class Bar : Foo
{
public Bar()
{
// nothing
}
public void DoSomething(int iValue)
{
m_iErrorCode = iValue;
if(m_iErrorCode!=0)
{
// *COMPILERERROR*
throw new Exception("Error occured: invalid value passed: " + m_iErrorCode.ToString());
}
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
Bar bTest = new Bar();
bTest.DoSomething(1);
}
}
} |