これは Xamarin Monodroid の問題のようで、ExportAttribute をコンストラクターに拡張するバグとして報告されています。詳細はこちらから:
http://forums.xamarin.com/discussion/500/inheriting-from-file入力ストリーム
ビルド時に、DeviceInputStream タイプを含む各 Java.Lang.Object サブクラスに対して Android Callable Wrappers (ACW) が生成されます。
public class DeviceInputStream
extends java.io.FileInputStream
implements
mono.android.IGCUserPeer
{
static final String __md_methods;
static {
__md_methods =
"n_read:()I:GetReadHandler\n" +
"";
mono.android.Runtime.register ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", DeviceInputStream.class, __md_methods);
}
public DeviceInputStream (java.io.File p0)
{
super (p0);
if (getClass () == DeviceInputStream.class)
mono.android.TypeManager.Activate ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Java.IO.File, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=c4c4237547e4b6cd", this, new java.lang.Object[] { p0 });
}
public DeviceInputStream (java.io.FileDescriptor p0)
{
super (p0);
if (getClass () == DeviceInputStream.class)
mono.android.TypeManager.Activate ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Java.IO.FileDescriptor, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=c4c4237547e4b6cd", this, new java.lang.Object[] { p0 });
}
public DeviceInputStream (java.lang.String p0)
{
super (p0);
if (getClass () == DeviceInputStream.class)
mono.android.TypeManager.Activate ("Scratch.ContentProvidersHateApplications.DeviceInputStream, Scratch.ContentProvidersHateApplications, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e", this, new java.lang.Object[] { p0 });
}
public int read ()
{
return n_read ();
}
private native int n_read ();
/* ... */
}
ACW は Java コードであるため、有効な Java コードである必要があります。残念ながら、この状況ではそうではありません。たとえば、DeviceInputStream(String) コンストラクターでの super(p0) 呼び出しは FileInputStream(String) であり、FileNotFoundException をスローするためです。
DeviceInputStream(String) コンストラクターは、例外をスローする可能性のあるメソッドを呼び出すため、DeviceInputStream(String) には throws 句を含めるか、super(p0) ステートメントの周りに try/catch ブロックを含める必要があります。どちらも起こらないため、コンパイラ エラーが発生します。
残念ながら、現時点では回避策はありません。コンストラクター本体の ACW にスローを追加する方法はなく、ACW のコンストラクターをカスタマイズする方法は他にないため、行き詰まっています。:-(
これが機能するように ExportAttribute を拡張するサポートは、バグ 8754で提出されています。