是否可以定义类对隐式强制转换尝试的响应?

时间:2019-09-24 14:10:57

标签: c# casting implicit-conversion

对于我的班级foo,如果我尝试这样做:

public foo ClassName = new foo();
public string MyString = ClassName;

我会收到一个明显的错误,因为ClassName不是字符串。

在这种情况下,是否有办法强制类的行为?类似于:

WhenCalledAsString {return self.ToString()}

3 个答案:

答案 0 :(得分:3)

是的,您应该实现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;

答案 1 :(得分:1)

您可以覆盖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!
}

答案 2 :(得分:0)

这就是您想要的:

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个值!