c# - 为什么我不能紧凑地使用我想要的 C# 多态性?

标签 c# polymorphism

这是我想做的:

XmlWriter writer = XmlWriter.Create(
    (string.IsNullOrEmpty(outfile) ? Console.Out : outfile)
);

然而,这不会编译,给出错误“无法确定条件表达式的类型,因为‘System.IO.TextWriter’和‘string’之间没有隐式转换”。上面的代码是以下代码的简化:

XmlWriter writer;

if (string.IsNullOrEmpty(outfile))
{
    writer = XmlWriter.Create(Console.Out); // Constructor takes TextWriter
}
else
{
    writer = XmlWriter.Create(outfile); // Constructor takes string
}

这两个对 Create 的调用是完全有效的,并且可以编译。有没有办法让它更紧凑,就像我试图对我的内联测试做的那样?

我想要的东西不起作用对我来说没有意义。仔细想想,编译器似乎会评估 string.IsNullOrEmpty(outfile) 以确定采用哪种情况:

  • 如果条件为真,它将与 Console.Out 一起使用,然后看到它需要以多态方式选择采用 TextWriter 的 XmlWriter.Create 版本.
  • 如果条件为假,它将与 outfile 一起使用,然后看到它需要以多态方式选择采用字符串的 XmlWriter.Create 版本。

机器学习编程是否扭曲了我的大脑?

最佳答案

您不能这样做的原因是因为编译器必须在编译时选择要使用的 Create 重载 - 您的方法将要求它在运行时完成。你能做到的最短可能是:

XmlWriter writer = String.IsNullOrEmpty(outfile)
    ? XmlWriter.Create(Console.Out)
    : XmlWriter.Create(outfile);

关于c# - 为什么我不能紧凑地使用我想要的 C# 多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1615351/

相关文章:

c# - 编码 UI + Windows Phone 8.1 — 获取屏幕尺寸和方向?

C# - 基类中的调用方法

c# - 具有多态数组的 WCF 客户端调用方法失败

c++ - 确保dynamic_cast不会导致未定义的行为C++

c++ - 从子类调用父虚函数

C#:将 CSS 注入(inject) MSHTML 实例的最佳方式?

c# - 如何使用旧的 WSDL+XSD 和当前的 Web 服务位置在 C# 中进行 SOAP 调用?

c# - Direct3D中的有效线图(Transformation2D?)

c# - 如何在 IIS 上运行电报机器人

c++ - 为什么这不是多态的?