我正在观看Scott Alan关于Pluralsight的关于C#中泛型的课程。在视频中,他为扩展方法创建了一个新的静态类,他在这个类中加入了一个公共委托,它看起来像这样:
using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace ScottAllen.Generics
{
public static class BufferExtensions
{
public delegate void Printer(object data);
public static void Dump<T>(this IBuffer<T> buffer, Printer print)
在Program.cs
我想使用此委托,在视频中我看到他只是在Main
方法中写道
Printer print...
并且编译器会识别Printer
但是当我尝试时,Printer
会用红色加下划线,我只能使用完全限定名{ {1}}。我试图清理项目,重新构建它等等,但似乎这不是问题。 ScottAllen.Generics.BufferExtensions.Printer
看起来像这样:
Program.cs
所以基本上我的问题是,为什么在视频中他可以使用using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ScottAllen.Generics
{
class Program
{
static void Main(string[] args)
{
ScottAllen.Generics.BufferExtensions.Printer ..
而我无法在不使用完全限定名称的情况下访问Printer
需要更改的内容?
答案 0 :(得分:2)
由于您与BufferExtensions位于同一名称空间,这就足够了:
static void Main(string[] args)
{
BufferExtensions.Printer ..
由于Printer
在BufferExtensions
类中声明,
指定BufferExtensions
类型时无法遗漏Printer
。
或者,您可以使用指令:
将别名赋予BufferExtensions.Printer
...
using Printer = BufferExtensions.Printer;
...
static void Main(string[] args)
{
Printer ..
答案 1 :(得分:1)
在另一个类中,您至少需要输入静态方法的名称:
BufferExtensions.Printer myPriner;
在C#6中,你可以用“使用静态”来做到这一点(见here)
using System.Console;
public void DoSomething()
{
WriteLine("Line 1");
WriteLine("Line 2");
WriteLine("Line 3");
}
答案 2 :(得分:1)
您可以将Printer
定义移到课堂之外:
namespace ScottAllen.Generics
{
public delegate void Printer(object data);
...
}
如果您在Printer
命名空间或包含ScottAllen.Generics
,则可以使用using ScottAllen.Generics;
类型而不带任何前缀。