【问题标题】:How to solve: Conversion operators cannot convert from an interface type如何解决:转换运算符无法从接口类型转换
【发布时间】:2016-04-06 13:16:51
【问题描述】:

我已经包装了 INetFwRule 成员,我已经将属性放在了一个名为 FirewallRule 的自定义类型中,并且为了在执行转换时节省代码的其他部分的时间从INetFwRuleFirewallRule 我试着写这个隐式转换器:

C#:

public static explicit operator FirewallRule(INetFwRule rule) {
    return new FirewallRule {
        Action = (FirewallRuleAction)rule.Action,
        ApplicationName = rule.ApplicationName,
        Description = rule.Description,
        // etc...
    };
}

Vb.Net(原创):

Public Shared Narrowing Operator CType(ByVal rule As INetFwRule) As FirewallRule

    Return New FirewallRule With {
        .Action = DirectCast(rule.Action, FirewallRuleAction),
        .ApplicationName = rule.ApplicationName,
        .Description = rule.Description,
        ' etc ...
    }

End Operator

但是,我在 rule 参数中收到此错误:

转换运算符不能从接口类型转换

有一种方法可以解决这个问题,以便能够编写CType?。

【问题讨论】:

  • @Bjørn-Roger Kringsjå 这说起来容易,但是……呵呵。感谢您的评论!
  • 您的问题似乎表明这在 VB 中是可能的,但在 C# 中是不可能的 - 但是在任何一种语言中都无效。
  • @Dave Doknjas 不,我只将代码放在 C# 中,因为如果他们看不到标记语言中的代码,很多人会否决问题......很多人不明白 OP 可能看起来对于 C# 答案,这是唯一的原因,对造成的混乱表示抱歉。感谢您的评论

标签: c# .net vb.net interface com


【解决方案1】:

编译器禁止您定义将接口作为参数的转换运算符,因为它认为此类转换已经定义(即内置的转换能力)。

您需要使用一些其他语法来启动 INetFwRuleFirewallRule 的转换 - 例如,INetFwRule 的扩展:

public static class NetFwRuleExt {
    public static FirewallRule ToFirewallRule(this INetFwRule rule) {
        return new FirewallRule {
            Action = (FirewallRuleAction)rule.Action,
            ApplicationName = rule.ApplicationName,
            Description = rule.Description,
            // etc...
        };
    }
}

而不是写

FirewallRule newRule = (FirewallRule)someRule;

您的 API 的客户端会编写

FirewallRule newRule = someRule.ToFirewallRule();

【讨论】:

  • 这个限制是不幸的,因为在我的情况下,编译器的假设是错误的。我的类没有实现该接口,并且接口 var 可能为空(VB 中为空)。我想我可以通过另一个方向并在目标类上创建一个静态(共享)方法来完成缩小转换。
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2014-10-01
相关资源
最近更新 更多