是否可以定义 class 对隐式转换尝试的响应?
Is it possible to define a class's response to implicit casting attempts?
对于我的 class foo
,如果我尝试这样做:
public foo ClassName = new foo();
public string MyString = ClassName;
我会得到一个明显的错误,因为 ClassName 不是字符串。
在这种情况下,有没有办法强制 class 的行为?大致如下:
WhenCalledAsString {return self.ToString()}
是的,您应该实施 implict operator
,例如:
public class foo {
....
public static implicit operator string(foo value) {
if (null == value)
return null;
//TODO: put relevant code here, e.g. value.ToString()
return "it's a foo class!";
}
}
那你可以把
public foo ClassName = new foo();
// "it's a foo class!";
public string MyString = ClassName;
您可以覆盖 ToString
并像这样定义隐式运算符:
public class foo
{
public static implicit operator string(foo f)
{
return f.ToString();
}
public override string ToString()
{
return "hello!";
}
}
然后这样称呼它(例如):
public static foo ClassName = new foo();
public static void Main()
{
string MyString = ClassName;
Console.WriteLine(MyString); // hello!
}
这就是你想要的:
class Program
{
static void Main(string[] args)
{
Pizza pizza = new Pizza();
string test = pizza;
}
}
public class Pizza
{
public static implicit operator string(Pizza pizza)
{
return pizza?.ToString();
}
}
输出:
Namespace.Pizza
编辑后的旁注:
它甚至支持 null
个值!
对于我的 class foo
,如果我尝试这样做:
public foo ClassName = new foo();
public string MyString = ClassName;
我会得到一个明显的错误,因为 ClassName 不是字符串。
在这种情况下,有没有办法强制 class 的行为?大致如下:
WhenCalledAsString {return self.ToString()}
是的,您应该实施 implict operator
,例如:
public class foo {
....
public static implicit operator string(foo value) {
if (null == value)
return null;
//TODO: put relevant code here, e.g. value.ToString()
return "it's a foo class!";
}
}
那你可以把
public foo ClassName = new foo();
// "it's a foo class!";
public string MyString = ClassName;
您可以覆盖 ToString
并像这样定义隐式运算符:
public class foo
{
public static implicit operator string(foo f)
{
return f.ToString();
}
public override string ToString()
{
return "hello!";
}
}
然后这样称呼它(例如):
public static foo ClassName = new foo();
public static void Main()
{
string MyString = ClassName;
Console.WriteLine(MyString); // hello!
}
这就是你想要的:
class Program
{
static void Main(string[] args)
{
Pizza pizza = new Pizza();
string test = pizza;
}
}
public class Pizza
{
public static implicit operator string(Pizza pizza)
{
return pizza?.ToString();
}
}
输出:
Namespace.Pizza
编辑后的旁注:
它甚至支持 null
个值!