Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果B extn方法是';在图书馆A&;它';我的客户使用的图书馆是什么?_C#_.net_Assemblies_Extension Methods - Fatal编程技术网

C# 如果B extn方法是';在图书馆A&;它';我的客户使用的图书馆是什么?

C# 如果B extn方法是';在图书馆A&;它';我的客户使用的图书馆是什么?,c#,.net,assemblies,extension-methods,C#,.net,Assemblies,Extension Methods,我有: 主程序类-使用库A 库A-具有与库B中的方法混合的部分类 库B-混合方法和接口 为什么我需要一个对LibaryB的using语句来让它们的扩展方法在主类中工作呢?这是因为库B定义了要扩展的类 编辑-除代码外 // *** PROGRAM *** using TopologyDAL; using Topology; // *** THIS WAS NEEDED TO GET EXTN METHODS APPEARING *** class Progra

我有:

  • 主程序类-使用库A
  • 库A-具有与库B中的方法混合的部分类
  • 库B-混合方法和接口
为什么我需要一个对LibaryB的using语句来让它们的扩展方法在主类中工作呢?这是因为库B定义了要扩展的类

编辑-除代码外

    // *** PROGRAM ***
    using TopologyDAL;
    using Topology;  // *** THIS WAS NEEDED TO GET EXTN METHODS APPEARING ***
    class Program
    {
        static void Main(string[] args)
        {
            var context = new Model1Container();
            Node myNode;  // ** trying to get myNode mixin methods to appear seems to need using line to point to Library B ***
         }
     }


// ** LIBRARY A
namespace TopologyDAL
{
    public partial class Node
    {
        // Auto generated from EF
    }

    public partial class Node : INode<int>   // to add extension methods from Library B
    {
        public int Key
    }
}

// ** LIBRARY B
namespace ToplogyLibrary
{
    public static class NodeExtns
    {
        public static void FromNodeMixin<T>(this INode<T> node) {
           // XXXX
        }
    }
    public interface INode<T> 
    {
        // Properties
        T Key { get; }

        // Methods
    }
/***程序***
使用拓扑学;
使用拓扑;//**这是使EXTN方法出现所必需的***
班级计划
{
静态void Main(字符串[]参数)
{
var context=new Model1Container();
Node myNode;//**试图让myNode mixin方法出现似乎需要使用行来指向库B***
}
}
//**图书馆A
名称空间拓扑
{
公共部分类节点
{
//从EF自动生成
}
公共分部类节点:INode//从库B添加扩展方法
{
公钥
}
}
//**图书馆B
命名空间ToplogyLibrary
{
公共静态类NodeExtns
{
nodeMixin(此INode节点)中的公共静态无效{
//XXXX
}
}
公共接口节点
{
//性质
T键{get;}
//方法
}

}

扩展方法只有在导入它们在中定义的命名空间时才可用

否则,编译器将需要针对每个引用库中的每个扩展方法进行解析,这将减慢编译时间。
此外,如果不同的命名空间包含具有相同签名的扩展方法,则无法使用扩展方法


总之,扩展方法本身就是特性,需要导入它们的名称空间;它们不会与它们扩展的类的命名空间一起自动导入。

扩展方法仅在导入它们在中定义的命名空间时可用

否则,编译器将需要针对每个引用库中的每个扩展方法进行解析,这将减慢编译时间。
此外,如果不同的命名空间包含具有相同签名的扩展方法,则无法使用扩展方法


总之,扩展方法本身就是特性,需要导入它们的名称空间;它们不会与它们扩展的类的命名空间一起自动导入。

这对于扩展方法来说是一个不幸的可发现性问题。为了使它们可用,您需要为包含具有扩展的静态类的名称空间添加
using
语句。看看这个关于扩展方法的文章

以下是有关扩展方法的详细信息:

那么编译器如何知道 要绑定的扩展方法?编译程序 在中查找扩展方法 调用被调用时最内部的命名空间 为扩展方法制作,然后在 由导入的所有名称空间 “使用”条款。这个过程是 然后向外移动直到我们到达 最顶层的命名空间

因为扩展方法可以 由导入到当前上下文中 “使用”条款,并受任何 可分配的对象(参见 兑换部分(详细信息)至 实例参数,各种 有趣的可能性为我们打开了大门 扩展由 类型。这可以简单地通过以下方式实现: 导入扩展库 方法,并将这些方法当作 它们是在您创建的类型上声明的 不要拥有。这意味着

  • 根据您导入的库,可以使代码执行不同的操作 事情

  • 客户机获得了一种有趣的方式来扩展他不拥有的类型

  • 我的理解是,使用扩展方法就像使用任何其他类型一样,只是不能限定它们(这在语法上是不可能的),因此需要使用
    语句。由于可以在不同名称空间的不同类中定义多个,编译器需要一种解决歧义的方法

    我设想在将来的VisualStudio将添加一个特性,以便在键入方法名时导入正确的名称空间,方法名的导入方式与类和接口名的导入方式类似

    考虑以下情况:

    namespace FruityNamespace {
      public static class FruityExtensions {
        public static string ToFunString(this int value) {return value + " bananas"; }
      }
    }
    
    namespace VegetablNamespace {
      public static class VegetablyExtensions {
        public static string ToFunString(this int value) {return value + " carrots"; }
      }
    }
    
    //In some other source file
    static void Main(/**/) {
      int things = 3;
      3.ToFunString(); //error CS1061: 'System.Int' does not contain a definition for 'ToFunString' and no extension method 'ToFunString' accepting a first argument of type 'System.Int' could be found (are you missing a using directive or an assembly reference?)
    }
    
    为了使用这些扩展方法中的任何一种,您需要导入正确的命名空间:

    using FruityNamespace;
    //OR
    using VegetablyNamespace;
    
    您可能会问,导入两个名称空间时会发生什么情况。您会遇到如下编译器错误:

    错误CS0121:以下方法或属性之间的调用不明确:“VegetablNamespace.VegetablyExtensions.ToFunString(int)”和“FROUTHYNAMESPACE.FROUTHYEXTENSIONS.ToFunString(int)”
    对于扩展方法来说,这是一个不幸的可发现性问题。为了使它们可用,您需要为包含具有扩展的静态类的名称空间添加
    using
    语句。看看这个关于扩展方法的文章

    以下是有关扩展方法的详细信息:

    那么编译器如何知道 要绑定的扩展方法?编译程序 在中查找扩展方法 调用被调用时最内部的命名空间 为扩展方法制作,然后在 由导入的所有名称空间 “使用”条款。这个过程是 然后向外移动直到我们到达 最顶层的命名空间

    因为扩展方法可以 由导入到当前上下文中 “使用”条款,并受任何 可分配的对象(参见 兑换部分(详细信息)至 实例参数,各种 有趣的可能性为我们打开了大门 扩展由 T error CS0121: The call is ambiguous between the following methods or properties: 'VegetablNamespace.VegetablyExtensions.ToFunString(int)' and 'FruityNamespace.FruityExtensions.ToFunString(int)'