如果条件方法被编译掉,每次调用的参数仍然在编译时进行类型检查。这样做的动机是什么?例子:
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int x = 2;
string st = "";
// this invocation compiles fine
ConditionalMethod(x, st);
// this invocation won't compile
ConditionalMethod(st, x);
}
[Conditional("condition")]
public static void ConditionalMethod(int x, string st) { }
}
}
需要明确的是,在此上下文中没有定义条件符号“条件”,因此从编译产生的 MSIL 中省略了方法调用。这与此处定义的规范一致,因此不足为奇。想象一个更复杂的场景:
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ConditionalMethod(new Bar());
}
[Conditional("condition")]
public static void ConditionalMethod(Foo foo) { }
public class Foo { }
#if condition
public class Bar : Foo { }
#else
public class Bar { }
#endif
}
}
只有在定义了条件符号“condition”时,“ConditionalMethod”的调用才会包含在结果编译中。然而,在这种情况下,Bar 实际上可以向上转换为 Foo。如果编译器知道对 'ConditionalMethod' 的调用将被编译掉,它是否也应该知道如果我们关心此方法的调用,此代码将是合法的?是的,这是一个人为的、令人毛骨悚然的例子,但它有助于说明我的问题。我是出于善意的好奇而问的,因为这已经激怒了我很长一段时间了。请帮忙,乔恩·斯基特。:)