c# - 即使我有隐式运算符,类型转换也会失败

标签 c# .net casting

我已经用隐式转换运算符编写了自定义类型

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/

相关文章:

c# - 有人可以解释这种通用语法吗?

c# - 如何在 Windows 窗体中创建垂直导航栏?

.net - 使用 nHibernate 标准将字符串转换为 bool

具有扩展类型的 Java 泛型转换

java - 在 Kotlin 中安全转换为泛型类型时出现异常

c# - 解析十六进制内容的文本文件

c# - 阅读前修剪值

c# - BackgroundService Graceful Shutdown - 完成工作并写入数据库

c# - 获取客户端和服务器之间的时区差异

c# - 如何在图像上使用 Alpha 绘制颜色 - C#/.NET