我有3个C#项目/程序集,A、B和C。 B引用A,C引用B。
在A中:
在B中:
在C语言中:
在A中:
using System.Collections.Generic;
namespace A
{
public class Dict : Dictionary<string, object> {}
public class Options: Dict {}
}
在B中:
using System.Collections.Generic;
using A;
namespace B
{
public class Client
{
public void M(IDictionary<string, string> d)
{
var dict = d.ToDict<Options>();
}
}
public static class Extensions
{
public static T ToDict<T>(this IDictionary<string, string> dictionary)
where T : Dict, new()
{
return new T();
}
}
}
在C语言中:
using System.Collections.Generic;
using B;
namespace C
{
public class Worker
{
public void M()
{
var client = new Client();
var d = new Dictionary<string, string> { { "k", "v" } };
var strings = new [] { "one", "two" }; // never used
client.M(d);
}
}
}
这全部编译成功。
如果我在项目C中导入System.Linq
命名空间,并在调用client.M()
之前添加行strings.Select(s => s);
(或任何LINQ方法),我会得到编译器错误:
类型“A.Dict”在未被引用的程序集中定义。 您必须添加对程序集“A,Version=1.0.0.0, Culture=neutral,PublicKeyToken=null”的引用。
将Extensions
类设置为internal
或将其移动到不同的命名空间可以避免此错误。
由于B应该包装A并隐藏其细节,因此让扩展方法成为公共的是错误的。但是我不明白为什么只有在引入LINQ时编译器才会选择这种方式。
是否至少存在一个扩展方法会导致编译器的行为略有不同?