[Mono-bugs] [Bug 655342] System.InvalidOperationException When Inheriting From IntentService

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Wed Dec 8 16:09:49 EST 2010



Jonathan Pryor <jpryor at novell.com> changed:

           What    |Removed                     |Added
             Status|REOPENED                    |RESOLVED
         Resolution|                            |WONTFIX

--- Comment #7 from Jonathan Pryor <jpryor at novell.com> 2010-12-08 21:09:48 UTC ---
This, in general, is currently unsolvable in the general case:

 1. Java constructors can't be `native`.
 2. Consequently, monodroid MUST generate _something_ for the Java proxy
constructor body.
 3. javac requires an implicit or explicit super() call
 4. When no default base constructor is present, super() is required.

As a result of 1-4, the Java Proxy for MyIntentService (comment 5) would need
to be:

    public MyIntentService ()
        if (getClass () == MyIntentService.class)
            mono.android.TypeManager.Activate (...);

Now tell me, what should `???` be?  In this case, `null` is the obvious answer,
and it would actually work.  However consider android.accounts.Account:

    // C#
    public class MyAccount : Android.Accounts.Account {
        public MyAccount () : base ("name", "type") {}

    // Java Proxy
    public MyAccount () {
        super (null);
        // ...

IIF Android creates a MyAccount instance, then the MyAccount constructor will
pass null to the Account(Parcel) constructor, which will result in a


Oops.  Not that using the Account(String,String) constructor would be any
better; that just results in an InvalidArgumentException.

The result is that, for SOME types, if Android creates them via the default
constructor then construction will FAIL and the C# constructor will never be

Just to make things inconsistent, creating MyAccount from C# would be perfectly
fine; it's only if the instance is created from Android/Java that things will

(Sounds like a great debugging excursion, doesn't it?)

There is only one way to sanely make this work -- and monodroid can't do it --
is to write custom Java code which subclasses e.g. Account and provides a
default constructor, which can provide the appropriate (Java-side) parameters.
Then it becomes a matter of getting your C# code to reference your Java code,
which something we need to better flesh out and document.

Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.

More information about the mono-bugs mailing list