[英]Is there a compiler switch to turn off support for Generics in C#?
我正在与合作伙伴合作,我们正在尝试将复杂的驱动程序从.NET平台迁移到.NET MicroFramework。
问题是.NET MF不支持泛型,当我们尝试构建应用程序时,最后一个“链接”操作以错误代码“CLR_E_PARSER_UNSUPPORTED_GENERICS”退出。 但是没有关于WHERE(模块,代码行)的信息。
据我们所知,没有人故意插入泛型,他们一直在查看代码,以确定问题是什么,没有运气。
所以我的问题是:是否有某种方法可以在VS2010中关闭对泛型的支持,以便编译器标记有问题的行?
有没有办法在VS2010中关闭对泛型的支持,以便编译器标记有问题的行?
是的,但它是一个“核”选项:
using System.Collections.Generic;
class Test
{
static void Main()
{
IEnumerable<int> x = null;
}
}
C:\> csc /langversion:ISO-1 \foo.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
c:\foo.cs(9,12): error CS1644: Feature 'generics' cannot be used because it is
not part of the ISO-1 C# language specification
ISO-1开关关闭了C#1.0中没有的所有功能,这些功能可能比您想要关闭的功能更多。
请注意,该开关不是“在C#2.0编译器中模拟C#1.0”开关; 如果你想运行C#1.0编译器,只需运行它。 该开关旨在识别特定版本中不存在的功能并禁止它们。
请注意,交换机也可能无法执行您需要执行的所有操作。 它只是禁止使用通用语法 。 如果您使用泛型类型而不实际使用通用语法 ,则交换机不会捕获它。
没有这种特定的编译器开关。
您可以查看源代码(或反编译的源代码)并搜索泛型的用法。 泛型可以在项目中声明 ,也可以由项目使用泛型构造(类,方法,变量......)。
您可能希望使用反射来查找程序集中的泛型声明(类,方法,字段,但不是变量)。 要查找泛型的用法,您还需要查看IL指令。 像Mono.Cecil这样的图书馆可以帮助你解决这个问题。
UPDATE
事实证明(当然,Eric Lippert帮助)你可以用这个开关编译C#1.0规范的代码:
除了仿制药,你还会错过添加至该几件事C#2.0和更高版本。
示例代码
使用Mono.Cecil,您可以加载程序集并获取其所有类型:
using Mono.Cecil;
using Mono.Cecil.Rocks;
...
var asm = AssemblyDefinition.ReadAssembly("MyAssembly.dll");
var types = asm.MainModule.GetAllTypes();
然后开始对他们进行有趣的查询:
var genericTypes = types.Where(type => type.HasGenericParameters);
var genericMethods = types.
Select(type =>
type.Methods.Where(method => method.HasGenericParameters));
var genericFields = types.
Select(type =>
type.Fields.Where(field => field.DeclaringType.HasGenericParameters));
var genericMethodInstructions = types.Select(type =>
type.Methods.Where(method => method.HasBody).
Select(method => method.Body.Instructions.
Where(instruction => instruction.Operand is MethodReference).
Select(instruction => (MethodReference)instruction.Operand).
Where(methodRef => methodRef.Resolve().HasGenericParameters)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.