如何解决:转换运算符无法从接口类型转换
How to solve: Conversion operators cannot convert from an interface type
我包装了 INetFwRule 成员,我把属性放在一个名为 FirewallRule
的自定义类型中,为了优雅以节省时间在代码的其他部分执行从 INetFwRule
到 FirewallRule
的转换时,我尝试编写这个隐式转换器:
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
参数中得到这个错误:
Conversion operators cannot convert from an interface type
有一种方法可以解决这个问题,可以编写 CType
?.
编译器禁止您定义将接口作为参数的转换运算符,因为它认为此类转换已经定义(即 built-in 转换能力)。
您需要使用一些其他语法来启动 INetFwRule
到 FirewallRule
的转换 - 例如, 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();
我包装了 INetFwRule 成员,我把属性放在一个名为 FirewallRule
的自定义类型中,为了优雅以节省时间在代码的其他部分执行从 INetFwRule
到 FirewallRule
的转换时,我尝试编写这个隐式转换器:
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
参数中得到这个错误:
Conversion operators cannot convert from an interface type
有一种方法可以解决这个问题,可以编写 CType
?.
编译器禁止您定义将接口作为参数的转换运算符,因为它认为此类转换已经定义(即 built-in 转换能力)。
您需要使用一些其他语法来启动 INetFwRule
到 FirewallRule
的转换 - 例如, 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();