这似乎是 Xamarin Monodroid 的一个问题,并且已作为一个错误提交,以将 ExportAttribute 扩展到构造函数。详细信息来自这里:
http://forums.xamarin.com/discussion/500/inheriting-from-fileinputstream
在构建时,会为每个 Java.Lang.Object 子类生成 Android Callable Wrappers (ACW),其中包括我们的 DeviceInputStream 类型:
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 添加 throws,也没有其他方法可以自定义 ACW 的构造函数,所以你被卡住了。:-(
支持扩展 ExportAttribute 以便它可以工作已在错误 8754中提交。