You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift转C#代码时viewDidLoad方法两行代码报错求助

嘿,我看你在把Swift代码转成C#的时候碰到了两个类型不匹配的问题,这俩都是Xamarin C#里常见的小坑,我给你逐个捋清楚怎么解决:

第一个错误:无法将ViewController隐式转换为IRegistryDelegate

在Swift里,只要你的ViewController类实现了RegistryDelegate协议的所有方法,就能直接把self赋值给registry.delegate,Swift会自动识别。但在C#(尤其是Xamarin环境下),你必须显式声明ViewController实现了IRegistryDelegate接口,还要确保实现接口里要求的所有方法,不然编译器不认。

解决步骤:

  1. 修改ViewController的类定义,加上接口实现:
public class ViewController : UIViewController, IRegistryDelegate
  1. 实现IRegistryDelegate接口里的所有抽象方法,哪怕暂时是空实现也行,比如:
// 替换成接口实际要求的方法名
public void OnRegistryChanged(Registry registry)
{
    // 这里写你的业务逻辑,或者暂时留空
}

第二个错误:无法将NSString隐式转换为NSSet

Swift里你写的[desiredType.IP]是一个数组,Swift会自动把它转换成Registry需要的集合类型,但C#没有这种自动转换。Registry的desiredType属性需要的是NSSet类型,所以你得手动把单个的NSString包装成NSSet。

解决方法:

把最后一行代码改成用NSSet的构造方法创建集合:

registry.DesiredType = new NSSet(desiredType.IP);

如果后续需要添加多个类型,直接在构造方法里传多个参数就行:

registry.DesiredType = new NSSet(desiredType.IP, desiredType.Hostname);

修正后的完整C#代码示例:

public class ViewController : UIViewController, IRegistryDelegate
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        Registry registry = new Registry(null);
        registry.Delegate = this;
        registry.DesiredType = new NSSet(desiredType.IP);
    }

    // 必须实现IRegistryDelegate接口的所有方法,示例方法名请根据实际接口调整
    public void OnRegistryUpdated(Registry sender)
    {
        // 这里添加你的逻辑实现
    }
}

内容的提问来源于stack exchange,提问作者user285594

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:07:42