为什么"as"运算符不在C#中使用隐式转换运算符?

Mar*_*oDS 16 .net c# types casting type-conversion

我在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在外部库代码的某处,将一个实例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
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么演员不使用隐式转换器?我认为这些的重点是使铸造和透明使用成为可能吗?

如果MyTypeexplicit转换器,这会有效吗?如果是这样,(怎么样)我可以同时拥有两个?

顺便说一句,如果类型在编译时已知,则转换肯定有效.这是因为运营商是static?有没有像非静态转换运算符?

PS我实际上对编译时行为和运行时行为之间的差异最感兴趣,所以我有一个后续问题:为什么隐式类型转换运算符在C#中不能在运行时动态使用?

Jon*_*eet 19

为什么软转换不使用隐式转换器?

嗯,基本上就是语言的指定方式.从C#5规范部分7.10.11:

如果E的编译时类型不是动态的,则操作E作为T产生与之相同的结果

E is T ? (T)(E) : (T)null
Run Code Online (Sandbox Code Playgroud)

除了E只评估一次.

[...]

请注意,使用as运算符无法进行某些转换(例如用户定义的转换),而应使用强制转换表达式执行转换.

  • @MDeSchaepmeester:说实话,我会放弃这个目标.尝试使一种类型看起来像另一种类型透明时,总会出现问题.我会回溯并查看其他设计. (2认同)

Mat*_*son 9

C#语言规范在文档中明确提到了这一点as:

请注意,使用as运算符无法进行某些转换(例如用户定义的转换),而应使用强制转换表达式执行转换.

所以你必须施展它.


Sri*_*vel 7

as关键字不考虑用户定义的运算符.您需要使用强制转换运算符.来自eric lippert的相关文章

在你的情况下,显式和隐式运算符都无法帮助你,因为你正在尝试强制object转换string为非转换MyTypestring.要使用户定义的转换运算符起作用,请将实例的时间类型编译为类型MyType而不是object.因为没有转换,从存在objectstring,但是从MyTypestring.