gpt4 book ai didi

c# - 间接引用声明具有类型限制的泛型扩展方法的程序集时出现奇怪的编译错误

转载 作者:行者123 更新时间:2023-11-30 18:53:58 26 4
gpt4 key购买 nike

嗯,很明显我的问题标题太复杂了。我只是试图让它尽可能具体。所以,我会尝试更好地解释这个问题。

问题背景

假设我们在一个解决方案中有三个 .NET 项目。主项目是一个简单的控制台应用程序 ApplicationAssembly。此项目引用了另一个托管程序集库 DirectlyReferencedLibrary。同时DirectlyReferencedLibrary指的是IndirectlyUsedLibrary

因此,项目用法如下所示:ApplicationAssembly --> DirectlyReferencedLibrary --> IndirectlyUsedLibrary

请注意,ApplicationAssembly 不直接使用任何声明为 IndirectlyUsedLibrary 的类型。我们还假设这些程序集中声明的所有类型都位于同一个命名空间中。

此解决方案可以编译并正常工作。

奇怪的问题

当我同时具备以下条件时就会出现问题:

  1. ApplicationAssembly 项目使用了 LINQ 表达式。例如,如果对任何可枚举类型的对象调用 Select()。
  2. DirectlyReferencedLibrary 声明了一个具有类型限制的通用扩展方法的类。类型限制表明泛型类型必须是 IndirectlyUsedLibrary 中类的后代。

这是此类的示例。

using System;

namespace Test
{
public static class UnUsedType
{
// It's a generic extension method with a type restriction.
public static void Magic<T>(this T @this)
// It's a type restriction that uses a type from the IndirectlyUsedLibrary.
where T : ProblemType
{
Console.WriteLine("I do nothing actually.");
}
}
}

当我尝试编译这个项目时,出现以下错误:

Error The type 'Test.ProblemType' is defined in an assembly that is not referenced. You must add a reference to assembly 'IndirectlyUsedLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. C:\Projects\Test\ApplicationAssembly\Program.cs 22 13 ApplicationAssembly

问题

谁能帮我理解为什么会这样?

附言

我做了一个小的调查解决方案。 如果你好心帮助我,你将能够接受 an archived solution here

附言

抱歉我的英语不好。

UPD1

另一个奇怪的事情是 LINQ 方法的不同调用可能会或可能不会产生编译时错误:

// Ok. Let's do some work using LINQ we love so much!
var strings = new[] { "aaa", "bbb", "ccc" };
Func<string, object> converter = item => (object) item;

// The following line makes problems.
var asObjects1 = strings.Select(converter);

// Everything is OK if we use the following line:
var asObjects2 = Enumerable.Select(strings, converter);

最佳答案

Can anyone help me to understand why is it so?

C# 编译器有合理的期望,即引用程序集的传递闭包 在编译时可用。它没有任何高级逻辑来推断它肯定需要、可能需要、可能不需要或绝对不需要知道什么来解决你的程序将要抛给它的类型分析中的所有问题.如果您直接或间接引用程序集,编译器会假定其中可能有它需要的类型信息。

另外,如果您在编译时没有引用的程序集集,那么用户在运行时会有什么期望?期望编译时环境至少具有运行时所需的程序集集似乎是合理的。

I don't want to do it.

在生活中,我们都不得不做不想做的事情。

关于c# - 间接引用声明具有类型限制的泛型扩展方法的程序集时出现奇怪的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8597486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com