如何在 C# 3.5 的超类中定义强制转换运算符?

Mar*_*kus 5 c# casting operator-keyword

我有一个容器类,用于向标准数据类型(如 int、string 等)添加一些属性。这个容器类封装了这样一个(标准类型)对象的对象。然后其他类使用容器类的子类来获取/设置添加的属性。现在我希望子类可以在其封装对象和自身之间隐式转换,而无需在其中添加额外的代码。

这是我的课程的简化示例:

  // Container class that encapsulates strings and adds property ToBeChecked
  // and should define the cast operators for sub classes, too.
  internal class StringContainer
  {
    protected string _str;

    public bool ToBeChecked { get; set; }

    public static implicit operator StringContainer(string str)
    {
      return new StringContainer { _str = str };
    }

    public static implicit operator string(StringContainer container)
    {
      return (container != null) ? container._str : null;
    }
  }

  // An example of many sub classes. Its code should be as short as possible.
  internal class SubClass : StringContainer
  {
    // I want to avoid following cast operator definition
    //    public static implicit operator SubClass(string obj)
    //    {
    //      return new SubClass() { _str = obj };
    //    }
  }

  // Short code to demosntrate the usings of the implicit casts.
  internal class MainClass
  {
    private static void Main(string[] args)
    {
      SubClass subClass = "test string"; // ERROR: Cannot convert source type 'string' to 'SubClass'

      string testString = subClass; // No error
    }
  }
Run Code Online (Sandbox Code Playgroud)

我真正的容器类有两个类型参数,一个用于封装对象的类型(string,int,...),第二个用于子类类型(例如SubClass)。

我怎样才能制作代码

SubClass subClass = "test string"; // ERROR: Cannot convert source type 'string' to 'SubClass'
Run Code Online (Sandbox Code Playgroud)

可以通过子类中的最少代码运行吗?

Tom*_*cek 1

我认为没有办法在基类中定义转换运算符。

基类对子类一无所知,因此它没有足够的信息来构造它。例如,如果您的SubClass类型只有一个需要一些参数的构造函数怎么办?基类不知道子类,因此无法以任何方式构造子类。

也许您可以使用另一种方法来参数化StringContainer类型。例如,您可以不使用实现继承(子类),而是将一些函数(类型的委托Func<...>)传递给StringContainer类。这样,用户可以参数化该类,并且您的隐式转换仍然有效。