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)
为什么演员不使用隐式转换器?我认为这些的重点是使铸造和透明使用成为可能吗?
如果MyType有explicit转换器,这会有效吗?如果是这样,(怎么样)我可以同时拥有两个?
顺便说一句,如果类型在编译时已知,则转换肯定有效.这是因为运营商是static?有没有像非静态转换运算符?
PS我实际上对编译时行为和运行时行为之间的差异最感兴趣,所以我有一个后续问题:为什么隐式类型转换运算符在C#中不能在运行时动态使用?
Jon*_*eet 19
为什么软转换不使用隐式转换器?
嗯,基本上就是语言的指定方式.从C#5规范部分7.10.11:
如果E的编译时类型不是动态的,则操作E作为T产生与之相同的结果
Run Code Online (Sandbox Code Playgroud)E is T ? (T)(E) : (T)null除了E只评估一次.
[...]
请注意,使用as运算符无法进行某些转换(例如用户定义的转换),而应使用强制转换表达式执行转换.
as关键字不考虑用户定义的运算符.您需要使用强制转换运算符.来自eric lippert的相关文章
在你的情况下,显式和隐式运算符都无法帮助你,因为你正在尝试强制object转换string为非转换MyType为string.要使用户定义的转换运算符起作用,请将实例的时间类型编译为类型MyType而不是object.因为没有转换,从存在object到string,但是从MyType到string.
| 归档时间: |
|
| 查看次数: |
2082 次 |
| 最近记录: |