繁体   English   中英

是否有编译器开关在C#中关闭对泛型的支持?

[英]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规范的代码:

/ langversion:ISO-1

除了仿制药,你还会错过添加至该件事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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM