Hello all,

I wrote a few months ago about a problem I was having with the new()
constraint on some generic abstract methods I was working with in a
project.  Today, I was trying to update my project to mono 1.2, and I
noticed that the code no longer compiles.  I distilled the issue down to a
sample code file I'm including.

It looks like the issue was fixed which prevented a generic method in a
derived class from overriding an abstract or virtual method in the base
class, in the cases where the base class defined a public parameterless
constraint (I don't know if this applies to other kinds of constraints.)
However, now, I am unable to call a second generic method that has the new()
constraint inside the derived method.  It complains that the type T must
have a public parameterless constructor in order to use it in the function
invocation.

Does this make sense?  Is there a workaround?  I suppose I could fudge
things for now by implementing interfaces in the abstract and derived
classes, but I'd like this to just work.  Any feedback appreciated.

following is the repro file.

cheers,

--ben

//BEGIN_FILE
using System;

namespace testConstraintsVirtuals
{
   class MainClass
   {
       public static void Main(string[] args)
       {
           Console.WriteLine("Hello World!");
       }
   }

   abstract class Base
   {
       public abstract void method<T>() where T : new();
   }

   class Derived : Base
   {
       // the first method signature is the ideal one.  this one compiles
with ms csc.  it's what you'd expect to do.
       // in mono 1.1.17, you could remove the override, and specify
constraints, and it would compile, now no longer.
       // gives error: The type `T' must have a public parameterless
constructor in order to use it as parameter `T' in the generic type or
method `testConstraintsVirtuals.Derived.method2<T>()'(CS0310)
       public override void method<T>()

       // public override void method<T>() where T : new()
       // gives error: Cannot specify constraints for overrides or explicit
interface implementation methods

       // public void method<T>() where T : new()
       // gives error: testConstraintsVirtuals.Derived.method<T>()' hides
inherited abstract member

       // new public void method<T>() where T : new()
       // gives error: testConstraintsVirtuals.Derived.method<T>()' hides
inherited abstract member
       {
           method2<T>();
       }

       public void method2<T>() where T : new()
       {

       }
   }
}
//END_FILE
--
ben joldersma
http://ben.creationsnetwork.org
_______________________________________________
Mono-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to