C# 隐式程序集范围使用指令

C# 隐式程序集范围使用指令,c#,C#,我们有一个核心库(CoreLibrary),其中包含在每个程序集中是非常有意义的。 目前有很多扩展方法,在每个文件中,我必须通过 using CoreLibrary; 是否可以使用CoreLibrary在每个程序集中隐式地包含,这样我就不必像mscorlib那样自己编写了?原因不仅是为了节省输入,而且是为了那些不知道扩展方法存在的用户 原因如下。我有一个 interface IArray { int Size { get;} // Returns data with a newly

我们有一个核心库(CoreLibrary),其中包含在每个程序集中是非常有意义的。 目前有很多扩展方法,在每个文件中,我必须通过

using CoreLibrary;
是否可以使用CoreLibrary在每个程序集中隐式地包含
,这样我就不必像mscorlib那样自己编写了?原因不仅是为了节省输入,而且是为了那些不知道扩展方法存在的用户

原因如下。我有一个

interface IArray
{
  int Size { get;}

  // Returns data with a newly created array.
  T[] GetData<T>();

  // Returns data in an already existing array.
  void GetData<T>(T[] data);
}
interface-ray
{
整数大小{get;}
//使用新创建的数组返回数据。
T[]GetData();
//返回已存在数组中的数据。
void GetData(T[]数据);
}
在实现IArray的每个类之前,都必须实现这两种方法(我有几个…)

类数组1d:IArray
{
公共整数大小{get;}
//使用新创建的数组返回数据。
T[]获取数据()
{
var数据=新的T[大小];
获取数据(数据);
返回数据;
}
//返回已存在数组中的数据。
void GetData(T[]数据)
{
//产生数据
}
}
现在我认为我可以在接口中使用默认实现,这样我就可以为实现IArray的每个类去掉每个完全相同的GetData实现

  interface IArray
    {
      int Size { get;}

      // Returns data with a newly created array.
      T[] GetData<T>()
      {
        var data = new T[Size];
        GetData(data);
        return data;
      }

      // Returns data in an already existing array.
      void GetData<T>(T[] data);
    }
interface-ray
{
整数大小{get;}
//使用新创建的数组返回数据。
T[]获取数据()
{
var数据=新的T[大小];
获取数据(数据);
返回数据;
}
//返回已存在数组中的数据。
void GetData(T[]数据);
}
到目前为止还不错,但是我知道我总是需要强制转换到IArray来获得对默认实现的访问,这是不可行的,而且对于默认实现,现在似乎还有其他方法。因此,我们想到了使用扩展方法

public static class ArrayExtensions : IArray
{
  public int Size { get;}


  // Returns data with a newly created array.
  public static T[] GetData<T>(this IArray array)
  {
    var data = new T[array.Size];
    array.GetData(data);
    return data;
  }    
}
公共静态类ArrayExtensions:IArray
{
公共整数大小{get;}
//使用新创建的数组返回数据。
公共静态T[]GetData(此IArray数组)
{
var data=newt[array.Size];
数组.GetData(数据);
返回数据;
}    
}
它工作得很好,但现在的效果是我必须包含名称空间,这基本上是可以的,但是在您可以通过Intellisense直接看到您有什么方法之前,如果您以前没有使用过扩展方法,那么现在您不知道扩展方法

是否可以使用CoreLibrary在每个程序集中隐式地包含
,这样我就不必像mscorlib那样自己编写了

K、 这里有三件不同的事情我们需要分开,但最终我相信答案只是“不”,但是

  • “在每个程序集中”-
    使用
    指令在每个文件中最宽(它们也可以是每个文件中的每个命名空间
  • 作用域)-而不是每个程序集(甚至每个类型,由于
    部分
    );它不能全局应用
  • 在汇编级别,您需要一个引用,而不是使用
  • 指令的
    ——可能是一个包引用;通过将
    (或类似内容)放在构建树中较高目录中的
    目录.Build.props
    文件中,这是一种可以全局应用的方法(注意:使用
    指令,拥有引用不会改变对每个文件
    的需求;这是“必要但不够的”)
    
  • “就像mscorlib做的那样?”-mscorlib不做这样的事

  • 我无法想象这是可能的。对于最基本的.Net名称空间,例如“System”,它甚至不可能在每个源文件中使用。除此之外,“隐性使用”对我来说也不是什么好主意。这将使你的命名空间与只有自己语言类型的“上帝命名空间”相称,比如“int”或“BoOL”。“像McScLIB”——意思是什么?甚至
    使用系统不是隐式的-它需要每个文件;你能举例说明你的意思吗?但是不,在常规C#中,隐式使用指令不是一件事;您可以在razor(cshtml)@Sinatr中实现这一点,它是一个using指令别名;不同的场景,尽管答案仍然是“否,它是每个文件/命名空间”@ GSELG语言,官方的位置是@ MSEDI重新编辑:考虑LINQ-一级语言特征(如果您使用“<代码>从X中的FO 语法等”)-通常基于扩展方法:仍然需要使用
    指令获得正确的
    。这似乎是一个文档问题,而不是其他任何问题。。。
    
    public static class ArrayExtensions : IArray
    {
      public int Size { get;}
    
    
      // Returns data with a newly created array.
      public static T[] GetData<T>(this IArray array)
      {
        var data = new T[array.Size];
        array.GetData(data);
        return data;
      }    
    }