【问题标题】:C# Implicit operator with generic具有泛型的 C# 隐式运算符
【发布时间】:2015-12-07 18:12:56
【问题描述】:

我正在为 C# 中的 enum 编写一个抽象包装器(我想要 Vala 中的 enum 之类的东西)。我的代码是:

    public abstract class Wraper<T, TE>
        where T : Wraper<T, TE>, new()
    {
        public TE Value;

        public static implicit operator T(TE value)
        {
            return new T() { Value = value };
        }

        public static implicit operator TE(T value)
        {
            return value.Value;
        }
    }

我想做这样的事情:

    public enum EFoo { A, B, C, D, E};
    public class Foo : Wraper<Foo, EFoo>
    {
        public bool IsBla
        {
            get { return Value == EFoo.A || Value == EFoo.E; }
        }
    }

    ...

    Foo foo = EFoo.A;
    bool bla = foo.IsBla;

但是代码不能编译,因为C#不允许这两个泛型参数,。编译时报错:

User-defined conversion must convert to or from the enclosing type

在线

public static implicit operator T(TE value)

有什么变通方法还是在 C# 中没有那么简单?

【问题讨论】:

  • 它与泛型参数无关 - 问题是 C# 只允许从或到它们定义的类型的转换运算符 - 在这种情况下,TTE 都不是类型,据编译器所知。你真的需要那些隐式转换吗?如果您只是简单地制作包装类型的枚举值字段(Java 的枚举几乎就是这样实现的)怎么办?
  • 不能用public static implicit operator Wrapper&lt;T, TE&gt;(TE value)吗?

标签: c# generics implicit-conversion


【解决方案1】:

隐式运算符必须从或转换为您定义它的类。由于您试图在抽象基类中定义它,它只能从该类转换或转换为该类。

Foo foo = EFoo.A; 行不起作用,因为您无法在抽象类中定义该转换,您只能在 Foo 类中定义它。

如果您更改了代码,如下所示,从/到基类转换,隐式转换工作,但您没有得到您想要的结果。 Wraper&lt;Foo,EFoo&gt; foo2 = EFoo.A; 有效,因为它可以在基类中定义。

您最好的选择可能是在创建 foo Foo foo = new Foo { Value = EFoo.A }; 或创建一些通用转换函数时使用初始化语法。

public abstract class Wraper<T, TE>
    where T : Wraper<T, TE>, new()
{
    public TE Value;
        
    public static implicit operator TE(Wraper<T, TE> value)
    {
        return value.Value;
    }

    public static implicit operator Wraper<T, TE>(TE value)
    {
        return new T { Value = value };
    }
}

public enum EFoo
{
    A,
    B,
    C,
    D,
    E
}

public class Foo : Wraper<Foo, EFoo>
{
    public bool IsBla
    {
        get
        {
            return Value == EFoo.A || Value == EFoo.E;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多