C# 在C中使用泛型委托时出现问题#

C# 在C中使用泛型委托时出现问题#,c#,C#,我有一个示例程序,其中有一个名为ObserverTest的类,其中有两个方法 一个用于订阅,一个用于通知任何类型的T,但我得到了一些构建错误 以下是我的示例代码> using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ObserverTest obs = ObserverTest.Instance();

我有一个示例程序,其中有一个名为
ObserverTest
的类,其中有两个方法

一个用于订阅,一个用于通知任何类型的T,但我得到了一些构建错误

以下是我的示例代码>

using System;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         ObserverTest obs = ObserverTest.Instance();
         obs.SubscribeToChange<int>(GotChange);
         obs.NotifyChange<int>(200);
         Console.ReadLine();
      }

      private static void GotChange(int val)
      {
         Console.WriteLine(string.Format("Changed value is {0}", val));
      }
   }

   public class ObserverTest
   {
      private static ObserverTest _obsTest;
      private Action<T> _observer;

      private ObserverTest()
      {
      }

      public static ObserverTest Instance()
      {
         return _obsTest = _obsTest == null ? new ObserverTest() : _obsTest;
      }

      public void NotifyChange<T>(T val)
      {
         _observer(val);
      }

      public void SubscribeToChange<T>(Action<T> observer)
      {
         _observer = observer;
      }

   }
}
有人能帮我删除错误吗


提前感谢。

尝试在类定义中添加泛型:

public class ObserverTest<T>
公共类observer测试
完整代码:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ObserverTest<int> obs = ObserverTest<int>.Instance();
            obs.SubscribeToChange<int>(GotChange);
            obs.NotifyChange<int>(200);
            Console.ReadLine();
        }

        private static void GotChange(int val)
        {
            Console.WriteLine(string.Format("Changed value is {0}", val));
        }
    }

    public class ObserverTest<T>
    {
        private static ObserverTest<T> _obsTest;
        private Action<T> _observer;

        private ObserverTest()
        {
        }

        public static ObserverTest<T> Instance()
        {
            return _obsTest = _obsTest == null ? new ObserverTest<T>() : _obsTest;
        }

        public void NotifyChange<E>(T val)
        {
            _observer(val);
        }

        public void SubscribeToChange<E>(Action<T> observer)
        {
            _observer = observer;
        }

    }
}
使用系统;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
ObserverTest obs=ObserverTest.Instance();
obs.SubscribeToChange(GotChange);
obs.NotifyChange(200);
Console.ReadLine();
}
私有静态void GotChange(int val)
{
WriteLine(string.Format(“更改的值为{0}”,val));
}
}
公共类观察者测试
{
专用静态ObserverTest\u ObserverTest;
私人行动观察员;
私有observer测试()
{
}
公共静态ObserverTest实例()
{
返回_obsTest=_obsTest==null?新建ObserverTest():_obsTest;
}
公共变更(T val)
{
_观察员(val);
}
公共部门主管(行动观察员)
{
_观察者=观察者;
}
}
}

尝试在类定义中添加泛型:

public class ObserverTest<T>
公共类observer测试
完整代码:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ObserverTest<int> obs = ObserverTest<int>.Instance();
            obs.SubscribeToChange<int>(GotChange);
            obs.NotifyChange<int>(200);
            Console.ReadLine();
        }

        private static void GotChange(int val)
        {
            Console.WriteLine(string.Format("Changed value is {0}", val));
        }
    }

    public class ObserverTest<T>
    {
        private static ObserverTest<T> _obsTest;
        private Action<T> _observer;

        private ObserverTest()
        {
        }

        public static ObserverTest<T> Instance()
        {
            return _obsTest = _obsTest == null ? new ObserverTest<T>() : _obsTest;
        }

        public void NotifyChange<E>(T val)
        {
            _observer(val);
        }

        public void SubscribeToChange<E>(Action<T> observer)
        {
            _observer = observer;
        }

    }
}
使用系统;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
ObserverTest obs=ObserverTest.Instance();
obs.SubscribeToChange(GotChange);
obs.NotifyChange(200);
Console.ReadLine();
}
私有静态void GotChange(int val)
{
WriteLine(string.Format(“更改的值为{0}”,val));
}
}
公共类观察者测试
{
专用静态ObserverTest\u ObserverTest;
私人行动观察员;
私有observer测试()
{
}
公共静态ObserverTest实例()
{
返回_obsTest=_obsTest==null?新建ObserverTest():_obsTest;
}
公共变更(T val)
{
_观察员(val);
}
公共部门主管(行动观察员)
{
_观察者=观察者;
}
}
}

如果您有一个属于泛型的成员,如
\u observer
,则需要在
observer test
类上放置一个类型参数,如下所示:

public class ObserverTest<T> {
}
公共类observer测试{
}

当然,您还需要修改
实例
方法

如果您有一个属于泛型的成员,如
\u observer
,则需要在
observer test
类上放置一个类型参数,如下所示:

public class ObserverTest<T> {
}
公共类observer测试{
}

当然,您还需要修改
实例
方法

您遇到的问题是,您正在声明一个具有泛型类型的字段成员,而该类没有:

public class ObserverTest
{
     private static ObserverTest _obsTest;
     private Action<T> _observer;

     ...
}

您遇到的问题是,您正在声明一个具有泛型类型的字段成员,而该类没有:

public class ObserverTest
{
     private static ObserverTest _obsTest;
     private Action<T> _observer;

     ...
}

另外,请记住,您没有正确地实现单例模式。另外,请记住,您没有正确地实现单例模式。@myermian如果没有它,我的VS不会编译该项目。你自己试试,也许你会更幸运。因为你仍然在用一个泛型类型
NotifyChange(200)
打电话。您可以从调用中删除和泛型参数,因为您从未使用过E类型。@myermian我知道,但这不是我的代码,所以我将其留给作者。@myermian如果没有它,我的VS不会编译项目。你自己试试,也许你会更幸运。因为你仍然在用一个泛型类型
NotifyChange(200)
打电话。您可以从调用中删除和泛型参数,因为您从未使用E类型。@myermian我知道,但这不是我的代码,所以我将此留给作者。