Я определил неявное преобразование строк из/в определенный тип в С# (фиктивный код):
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
? Есть ли что-то вроде операторов нестатического преобразования?
P.S. Меня больше всего интересуют различия между поведением во время компиляции и временем выполнения, поэтому у меня есть следующий вопрос: Почему неявные операторы преобразования типов не динамически используются во время выполнения в С#?