c# - 在 Windows、MonoForAndroid 和 MonoTouch 上实现接口(interface)的差异

标签 c# .net visual-studio xamarin.ios xamarin.android

我正在移植我在 Windows Mobile 上的一些旧代码。该代码可以很好地针对 .NET 3.5 CE 进行编译。我在 MonoForAndroid 中创建了一个项目并引用了相同的代码(.cs 文件被引用为链接)并且它为 Android 构建得很好。

但是,当我为 MonoTouch 创建一个项目并引用相同的 C# 代码文件时,它无法构建并抛出一个错误,指出方法未实现。

这是我的:

public interface IJobController
{
   IUser User {get; }
}

public class BaseController 
{
   public virtual IUser User {get;set;}
}


public class BaseJobController : BaseController
{
   public new User User {get;set;}
}

public class JobController : BaseJobController, IJobController
{
  // some code here that uses the User property  
}

错误表明 JobController 没有实现方法 IUser User { get;} 候选人是 BaseJobController 中的那个,但类型确实不匹配 IUserUser

同样的代码已经在 Windows Mobile .NET 3.5 CE 上运行多年,同样的代码在 MonoForAndroid 上编译得很好。但是,它不能在 MonoTouch 上编译。

我担心的是在 MonoTouch 中实现继承和接口(interface)实现的方式不同,我还有很多工作要做(很多代码要移植),所以我应该期待更多这样的惊喜吗?

任何帮助将不胜感激。

最佳答案

好吧,这显然是一个错误,因为您的代码确实可以在这些其他平台上编译。我推荐你file a bug跟他们。同样清楚的是,编译器对你对虚拟方法使用 new 关键字感到困惑。这是一种耻辱。

话虽这么说,但它很容易变通,至少在修复之前是这样。只需使用显式接口(interface)实现:

public class JobController : BaseJobController, IJobController
{
    IUser IJobController.User
    {
        get { return User; }
    }
}

在 Xamarin 产生修复之前,这应该足够了。

关于c# - 在 Windows、MonoForAndroid 和 MonoTouch 上实现接口(interface)的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915752/

相关文章:

.net - Visual Studio 2010 代码分析 - 在解决方案上运行

c++ - Visual Studio C++ : Debug Assertion Failed

c# - 如何将 JSON 文件发布到 ASP.NET MVC 操作?

c# - 命名空间中不存在类型。你错过了一个大会吗?

c# - 计算 "Pie Segment"和 "sub areas"区域的边界点

c# - 私有(private)类级变量是否继承?

c++ - 通过不明确的转换运算符进行引用绑定(bind)

javascript - ASP.NET MVC - 在客户端 JS 中访问 C# 字符串

c# - 如何在 ASP.NET 中重写我的 URL?

.net - 如何避免出现以下错误: "Automation Error. It is illegal to call out while inside message filter "?