是否可以为一个类定义(也许)一个运算符,从而可以使用“ 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
运算符,我刚刚习惯了...
答案 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)
。