用户定义的转换必须转换为封闭类型或从封闭类型转换

时间:2013-12-27 11:49:29

标签: c# .net

有人可以帮助我吗?

错误:用户定义的转换必须转换为封闭类型或来自:

public static explicit operator E(M value)
{
    return value.Value;
}
public static implicit operator M(E value)
{
    return new M { Value = value };
}

示例:

BaseModel

public abstract class BaseModel<E, M>
    where E : class, new()
    where M : BaseModel<E, M>, new()
{
    public BaseModel()
    {
        this.Value = new E();

    }

    public static explicit operator E(M value)
    {
        return value.Value;
    }
    public static implicit operator M(E value)
    {
        return new M { Value = value };
    }

    public E Value { get; set; }

    public override string ToString()
    {
        return Value.ToString();
    }
}

用法:

public class Usuario
{
    public int PK_USUARIO { get; set; } //IDENTITY(1,1) NOT NULL,
    public bool USUA_NR_ATIVO { get; set; } //bit NOT NULL,
}

型号:

    [DisplayName("Status")]
    [System.ComponentModel.Editor(typeof(bool), typeof(bool))]
    public bool Ativo
    {
        get { return Value.USUA_NR_ATIVO; }
        set { Value.USUA_NR_ATIVO = value; }
    }

2 个答案:

答案 0 :(得分:1)

我知道您正在尝试做什么。不幸的是,.NET 不允许在基类中定义转换运算符。它们只能转换为确切的类型。参数或返回类型必须与当前类完全匹配。

因此必须在派生类echo bin2hex($record['author']); SELECT name, HEX(name) FROM authors WHERE ... 中定义转换运算符。 当然,这违反了DRY原则,但是我不知道如何实现泛型转换运算符。我认为这是根本不可能的,因为一般而言,泛型转换将适用于无限数量的类型。

在第一种情况下,您可能会住

M

但是逆转换将不起作用。这意味着public static explicit operator E(BaseModel<E,M> value) { return value.Value; } 可以转换为从E派生的任何类型。这可能不是您想要的。

但是,如果可以使用上述通用转换,则只需在任何派生类中定义一个 个运算符。至少这要少干。


一些进一步的评论: 您还应该知道,使用BaseModel<E,M>会很慢,因为它会调用where X : new(),而Activator.CreateInstance本身是使用反射来调用构造函数的。

您可以通过使用带有E参数和缓存的已编译表达式的构造函数来调用此构造函数来避免这种情况。这样可以避免对第一个实例以外的每个实例进行反射调用。

答案 1 :(得分:0)

您需要将此代码留在将要转换的类中。如下面的示例。

class MyClass {
    public static explicit operator xxx(string s) { // details }
    public static implicit operator string(xxx x) { // details }
}

如果您的类无法创建,请尝试使用可以工作的部分类