2015-03-27 2 views
0

Я наблюдаю курс Скотта Алана на 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 подчеркнут красным и я могу использовать его только с полным именем 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 и я не могу и то, что нужно изменить для того, чтобы получить доступ к Printer без использования полного имени ?

ответ

1

0 Выводить по: может двигаться Printer определения вне класса:

namespace ScottAllen.Generics 
{ 
    public delegate void Printer(object data); 
    ... 
} 

Тогда вы будете иметь возможность использовать Printer типа без префикса, если вы находитесь в ScottAllen.Generics пространства имен или если using ScottAllen.Generics; включен.

+0

Yeap, я полностью пропустил это. Я утверждаю, что в Dusan действительно было что-то, что я забыл, и именно тот факт, что делегат определен вне класса! Теперь все в порядке. благодаря – Leron

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 .. 
+0

Я бы согласился с вами, и я даже не поставил бы этот вопрос, если бы учебник не был до конца до конца до конца, и я вижу, что «Принтер» используется на его собственном даже с «BufferExtensions». Наверное, пока я оставлю тему такой, какой она есть. Но если вы обойдете этот урок, вы можете сами убедиться. Я почти уверен, что ничего не пропустил. Это должно быть то, что напрямую не связано с дженериками, поэтому это не объясняется в учебнике, но я вижу, как он работает, как описано в моем OP. Версия .NET - 4.5, используемая от Скотта Алана. – Leron

+0

Извините, как вы можете видеть на ответе Игоря, я действительно пропустил что-то важное. Однако он указал, как заставить его работать, поэтому я приму его ответ, но спасибо за вашу помощь! – Leron

1

В другом классе вам нужно набрать по крайней мере, имя статического метода в:

BufferExtensions.Printer myPriner; 

В C# 6, вы» (см. here)

using System.Console; 

public void DoSomething() 
{ 
    WriteLine("Line 1"); 
    WriteLine("Line 2"); 
    WriteLine("Line 3"); 
} 
Смежные вопросы