C#(CS0039)如何使用as运算符定义从字符串到自定义类的转换?

时间:2019-03-06 16:28:05

标签: c# casting

是否可以为一个类定义(也许)一个运算符,从而可以使用“ as”转换?

重点是:

class C
{
   string a;
   string b;

   public C what_here(string s)
   {
      a = s.Substring(0, 2);
      b = s.Substring(3);
   }
}

该类的用法:

("something" as C).a;

这给出了:

  

错误CS0039:无法通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换将类型“字符串”转换为“ C”

P.S。真正的class C更大,关键是如何启用as 运算符,我刚刚习惯了...

1 个答案:

答案 0 :(得分:0)

根据as的{​​{3}}:

  

请注意,as运算符仅执行参考转换,可为空的转换和装箱转换。 as运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式来执行。

因此,您将无法使用as来调用隐式运算符。

但是,如果您准备使用隐式或显式强制转换:

class C
{
   // Obviously you want to encapsulate these as properties, not fields
   public string a;
   public string b;

   public static implicit operator C(string s)
   {
      var localA = s.Substring(0, 2);
      var localB = s.Substring(3);
      return new C
      {
         a = localA,
         b = localB
      };
   }
}

void Main()
{
    C myC = "AA BBBBBBBB"; // Or explicitly, var myC = (C)"AA BBBBBBBB"
    Console.WriteLine(myC.a);
    Console.WriteLine(myC.b);
}

输出:

AA
BBBBBBBB

但是!不要滥用转换操作符

根据@Kieran的评论,转换运算符以任意方式使用时,对于其他人来说确实很难理解。将字符串自动转换为您自己的自定义类并不是特别直观。 IMO以下替代方法更易于阅读。

构造函数重载:

var myC = new C("string to parse here");

或扩展方法:

var myC = "string to parse here".ToC();  

其中ToC与转换运算符的代码相同,但签名为public static C ToC(this string s)