<br><font size=2 face="sans-serif">Hi,</font>
<br>
<br><font size=2 face="sans-serif">I am using version 1.2.5.1 of Mono and
I am having some troubles in using a generic parameter in a method, which
seems to be a bug. </font>
<br>
<br><font size=2 face="sans-serif">The following code compiles fine:</font>
<br>
<br>
<br><font size=2 color=blue>using</font><font size=2> System;</font>
<br>
<br><font size=2 color=blue>namespace</font><font size=2> TestMethodParameterTypeMono</font>
<br><font size=2>{</font>
<br><font size=2>&nbsp; &nbsp;</font><font size=2 color=blue>class</font><font size=2>
</font><font size=2 color=#008080>Program</font>
<br><font size=2>&nbsp; &nbsp;{</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; </font><font size=2 color=blue>static</font><font size=2>
</font><font size=2 color=blue>void</font><font size=2> Main(</font><font size=2 color=blue>string</font><font size=2>[]
args)</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; {</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</font><font size=2 color=#008080>Class1</font><font size=2>&lt;</font><font size=2 color=blue>double</font><font size=2>&gt;
myClass1 = </font><font size=2 color=blue>new</font><font size=2> </font><font size=2 color=#008080>Class1</font><font size=2>&lt;</font><font size=2 color=blue>double</font><font size=2>&gt;();</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</font><font size=2 color=blue>int</font><font size=2>
i = myClass1.MethodB&lt;</font><font size=2 color=#008080>DoubleCalculator</font><font size=2>&gt;();</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2>&nbsp; &nbsp;}</font>
<br>
<br><font size=2>&nbsp; &nbsp;</font><font size=2 color=blue>public</font><font size=2>
</font><font size=2 color=blue>interface</font><font size=2> </font><font size=2 color=#008080>ICalculator</font><font size=2>&lt;T&gt;</font>
<br><font size=2>&nbsp; &nbsp;{</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; T Add(T a, T b);</font>
<br><font size=2>&nbsp; &nbsp;}</font>
<br>
<br><font size=2>&nbsp; &nbsp;</font><font size=2 color=blue>public</font><font size=2>
</font><font size=2 color=blue>struct</font><font size=2> </font><font size=2 color=#008080>DoubleCalculator</font><font size=2>
: </font><font size=2 color=#008080>ICalculator</font><font size=2>&lt;</font><font size=2 color=blue>double</font><font size=2>&gt;</font>
<br><font size=2>&nbsp; &nbsp;{</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; </font><font size=2 color=blue>public</font><font size=2>
</font><font size=2 color=blue>double</font><font size=2> Add(</font><font size=2 color=blue>double</font><font size=2>
a, </font><font size=2 color=blue>double</font><font size=2> b)</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; {</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</font><font size=2 color=blue>return</font><font size=2>
a + b;</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2>&nbsp; &nbsp;}</font>
<br>
<br><font size=2>&nbsp; &nbsp;</font><font size=2 color=blue>public</font><font size=2>
</font><font size=2 color=blue>class</font><font size=2> </font><font size=2 color=#008080>Class1</font><font size=2>&lt;T&gt;
</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; </font><font size=2 color=blue>where</font><font size=2>
T : </font><font size=2 color=#008080>IComparable</font><font size=2>&lt;T&gt;</font>
<br><font size=2>&nbsp; &nbsp;{</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; </font><font size=2 color=blue>private</font><font size=2>
</font><font size=2 color=blue>int</font><font size=2> i = 5;</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; </font><font size=2 color=blue>public</font><font size=2>
</font><font size=2 color=blue>int</font><font size=2> MethodB&lt;C&gt;()
</font><font size=2 color=blue>where</font><font size=2> C : </font><font size=2 color=#008080>ICalculator</font><font size=2>&lt;T&gt;,
</font><font size=2 color=blue>new</font><font size=2>()</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; {</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</font><font size=2 color=blue>return</font><font size=2>
i;</font>
<br><font size=2>&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2>&nbsp; &nbsp;}</font>
<br><font size=2>}</font>
<br>
<br>
<br><font size=2 face="sans-serif">On the other hand, if I take the class
Program and put it in a different file and compile it isolated making a
reference to the previous generated .exe, the following compilation error
appears:</font>
<br>
<br><font size=2 face="sans-serif">Program.cs(13,27): error CS0309: The
type `TestMethodParameterTypeMono.DoubleCalculator' must be convertible
to `TestMethodParameterTypeMono.ICalculator&lt;TestMethodParameterTypeMono.DoubleCalculator&gt;'
in order to use it as parameter `C' in the generic type or method `TestMethodParameterTypeMono.Class1&lt;double&gt;.MethodB&lt;C&gt;()'</font>
<br>
<br>
<br>
<br><font size=2 face="sans-serif">Note that the constraint on type parameter
C on MethodB is to implement ICalculator&lt;double&gt;, which DoubleCalculator
does, instead of ICalculator&lt;DoubleCalculator&gt; as the message suggests.</font>
<br>
<br><font size=2 face="sans-serif">Am I missing something or is it really
a bug?</font>
<br>
<br><font size=2 face="sans-serif">Thanks, </font>
<br>
<br><font size=2 face="sans-serif">José Roberto P. Rodrigues<br>
PETROBRAS/CENPES/Tecnologia de Reservatórios<br>
tel.: 55-21-3865-6494 (rota: 812) - chave: bg11</font>