【发布时间】:2016-06-01 04:30:53
【问题描述】:
我已经在 C#(虚拟代码)中定义了从/到某种类型的隐式字符串转换:
public class MyType
{
public string Value { get; set; }
public static implicit operator MyType(string fromString)
{
return new MyType { Value = fromString };
}
public static implicit operator string(MyType myType)
{
return myType.Value;
}
}
在外部库代码的某处,MyType 的实例作为object 参数传递给方法。该方法的一部分看起来像这样:
private void Foo(object value)
{
// ... code omitted
var bar = value as string // note that value is an instance of MyType at runtime
if(bar != null) // false, cast fails
{
// ... code omitted
}
}
为什么强制转换不使用隐式转换器?我认为这些的全部意义在于使投射和透明使用成为可能?
如果 MyType 有一个 explicit 转换器,这会起作用吗?如果是这样,(如何)我可以两者兼得?
顺便说一句,如果类型在编译时已知,则强制转换肯定有效。这是因为运营商是static吗?有没有类似非静态转换运算符的东西?
附:我实际上对编译时行为和运行时行为之间的差异最感兴趣,所以我有一个后续问题:Why are implicit type conversion operators not dynamically usable at runtime in C#?
【问题讨论】:
-
顺便说一句,我以前从未听说过
as运算符被称为“软演员”。 -
@JonSkeet 真的让我吃惊,也许不是官方术语,但我肯定见过很多次。
-
搜索“软演员”和 C# 得到 636 个结果,在我看来,这是一个 小 数字。我以后肯定会避免使用它——它肯定不是 C#规范术语的一部分。
-
@JonSkeet 是否有类似简洁(但更正确)的等效术语?
-
@MDeSchaepmeester:但在这种情况下,您只是在团队中加强了对非标准术语的使用。如果您使用标准术语,我怀疑他们会也理解您 - 但在外部讨论事物时,你们中的任何人都不必改变您的谈话方式。
标签: c# .net types casting type-conversion