我已经用隐式转换运算符编写了自定义类型
public class TcBool : TcDataTypeBase
{
public TcBool() : base(1, false) { } //For somewhat reason without this callin new TcBool() fails
public TcBool(bool value = false) : base(1, value) { }
public static implicit operator bool(TcBool var) => (bool)var.Value;
public static implicit operator TcBool(bool value) => new TcBool(value);
}
public abstract class TcDataTypeBase
{
public readonly byte Size;
public readonly object Value;
public string Name { get; set; }
public int IndexGroup { get; set; }
public int IndexOffset { get; set; }
internal TcDataTypeBase(byte size, object value)
{
Size = size;
Value = value;
}
internal TcDataTypeBase(string name, byte size, object value) : this(size, value)
{
Name = name;
}
}
然后,当我尝试使用 PropertyInfo.SetValue() 将它写入对象的 bool 属性时,它会抛出一个异常,提示它无法将 TcBool 转换为 System.Boolean。
是否有什么东西阻止了反射机制使用隐式转换,还是我遗漏了什么?
最佳答案
编译器不知道它必须转换任何东西,因为 SetValue 接受一个 对象
,它与 TcBool
类型兼容,没有任何转换(事实上,你不能为祖先类型定义隐式转换运算符)。要强制转换,您可以这样做:
property.SetValue(instance, (bool)TcBool);
这将触发您的隐式转换运算符并创建一个 bool 值,然后将其装箱到一个对象中并传递给 SetValue。
关于c# - 即使我有隐式运算符,类型转换也会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49399894/