这里就是我想要做的:

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

这并不是编纂,但是,给予的错误"类型的条件式不能确定,因为没有隐性转换之间的系统。IO.形式'和'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, ,然后看到,它需要多态方式选择的版本 XmlWriter.Create 这需要一种形式.
  • 如果条件是假的,它会去 outfile, ,然后看到,它需要多态方式选择的版本 XmlWriter.Create 这需要一串。

已经编程在毫升扭曲我的大脑?

有帮助吗?

解决方案

原因你不能这样做,是因为编译器必须选择其中载的创建使用的在汇编时间-你的方法就需要它在运行时间。最短您可以做它很可能是:

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

其他提示

每个人似乎都表明以下:

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

然而,这也是可行的:

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

后者是更接近你的原始尝试并且,海事组织、更加紧凑。

C#编译器选择的方法来执行静态期间的汇编。IL生成时,编译是一个参照特定的方法。多态性部分是在运行时,当它选择执行特定功能,以执行。

你?:发言,是评估在运行时和作为例编译器不能找出哪些方法来执行。

改变这个和它会工作。

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

问题是,你不能确定在编制时什么

(string.IsNullOrEmpty(outfile) ? Console.Out : outfile)

应该返回。要一串或是它会是一个形式?只能在运行时确定的,因此编译错误,因为在?操作者必须解决在编制时间。

最好你可以把它弄出来很可能是:

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

一对夫妇的事情发生在这里。

首先,对"例外"是存在的,因为三操作员(tm),不是因为你使用它。问题是因为你有一个单一的表达,是试图返回两种不同类型,不能解决一个单一、共同基本类型(其他对象)。

另外,你的构造过载可能采取两种完全不同的类型,没有关以任何方式。C#编译器是非常, 非常 聪明,但它不是 聪明。

不,你必须让两个独立的呼吁,因为他们是两个分开的构造方法。

其中载到电话是确定在编制时间,所以你不能选择一个数据类型在运行时调用不同的重载。

还有,有条件的操作者只能返回一个单一的数据类型,你不能拥有这回不同的数据类型取决于选择。

C#是静态型的所有多神奇发生的事情编制时间。和您的条件式是不知道在编制时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top