C# 如何采取行动<;T>;泛型方法中的参数?

C# 如何采取行动<;T>;泛型方法中的参数?,c#,generics,C#,Generics,我有以下代码。编译器给出 Error CS7036 There is no argument given that corresponds to the required formal parameter 'parameter' of 'SARSystem.WithLock<T>(SARSystem.Locks, Action<T>, T) public class Locks { private Locks() {} priv

我有以下代码。编译器给出

Error   CS7036  There is no argument given that corresponds to the required formal parameter 'parameter' of 'SARSystem.WithLock<T>(SARSystem.Locks, Action<T>, T)


public class Locks
{         
    private Locks() {}
    private static object _lock = new object();
    public static object Lock { get { return _lock; } }
}

public static void WithLock<T>(Locks theLock, Action<T> action, T param)
{
    Monitor.Enter(theLock);
    {
        try
        {
            action(param);
        }
        finally
        {
            Monitor.Exit(theLock);
        }
    }
}

private static Locks tradingSystemLock;

public void OnQuote(TickPriceMessage tp)
{
    // How do I call WithLock? This doesn't work.
    WithLock(tradingSystemLock, delegate (TickPriceMessage tpm) { Console.WriteLine(tp.ToString()); });                  
}
错误CS7036未给出与“SARSystem.WithLock”(SARSystem.Locks,Action,T)的必需形式参数“parameter”相对应的参数
公共类锁
{         
私有锁(){}
私有静态对象_lock=新对象();
公共静态对象锁{get{return_Lock;}}
}
带锁的公共静态无效(锁定锁、动作动作、T参数)
{
监视器。进入(锁定);
{
尝试
{
行动(参数);
}
最后
{
监视器。退出(锁定);
}
}
}
私有静态锁交易系统锁;
公开作废OnQuote(TickPriceMessage tp)
{
//我怎么用锁打电话?这不行。
WithLock(tradingSystemLock,delegate(TickPriceMessage tpm){Console.WriteLine(tp.ToString());});
}

根据Lee的评论,您的方法采用三个参数:

WithLock<T>(Locks theLock, Action<T> action, T param)
带锁(锁锁、动作、T参数)
锁定、委托和参数

以下方面应起作用:

public void OnQuote(TickPriceMessage tp)
{        
    WithLock<TickPriceMessage>(tradingSystemLock, (tpm) => {Console.WriteLine(tpm.ToString());}, tp);                  
}
public void OnQuote(TickPriceMessage tp)
{        
WithLock(tradingSystemLock,(tpm)=>{Console.WriteLine(tpm.ToString());},tp);
}

根据Lee的评论,您的方法采用三个参数:

WithLock<T>(Locks theLock, Action<T> action, T param)
带锁(锁锁、动作、T参数)
锁定、委托和参数

以下方面应起作用:

public void OnQuote(TickPriceMessage tp)
{        
    WithLock<TickPriceMessage>(tradingSystemLock, (tpm) => {Console.WriteLine(tpm.ToString());}, tp);                  
}
public void OnQuote(TickPriceMessage tp)
{        
WithLock(tradingSystemLock,(tpm)=>{Console.WriteLine(tpm.ToString());},tp);
}

您的
操作
调用没有问题,但是您调用函数的方式有问题:

WithLock(tradingSystemLock, 
    delegate (TickPriceMessage tpm) { Console.WriteLine(tp.ToString()); },
    tp);
如果您费心阅读/发布收到的错误消息,这一点会立即显现出来


顺便说一句,你的
加锁不仅没用,而且也错了——我想你想锁定
锁。锁
,而不是
。可以理解,给定变量的描述性名称。

调用
操作没有问题,但是调用函数的方式有问题:

WithLock(tradingSystemLock, 
    delegate (TickPriceMessage tpm) { Console.WriteLine(tp.ToString()); },
    tp);
如果您费心阅读/发布收到的错误消息,这一点会立即显现出来


顺便说一句,你的
加锁不仅没用,而且也错了——我想你想锁定
锁。锁
,而不是
。可以理解,给定变量的描述性名称。

action(anObjectOfTypeT)谢谢,请参阅我的编辑。另外,您的
监视器。输入
/
监视器。退出
/
尝试
/
最后
结构可以简单地表示为
块。
带锁
接受3个参数,您只提供2个。您需要向带有锁的
提供
TickPriceMessage
tp
?)的实例。似乎您想要
带锁(tradingSystemLock,delegate(tickpricemessagem){Console.WriteLine(m.ToString());},tp)
@Ivan您可以使用lock(tradingSystemLock,m=>Console.WriteLine(m.ToString()),tp)将其写得更短
动作(anObjectOfTypeT)谢谢,请参阅我的编辑。另外,您的
监视器。输入
/
监视器。退出
/
尝试
/
最后
结构可以简单地表示为
块。
带锁
接受3个参数,您只提供2个。您需要向带有锁的
提供
TickPriceMessage
tp
?)的实例。似乎您想要
带锁(tradingSystemLock,delegate(tickpricemessagem){Console.WriteLine(m.ToString());},tp)
@Ivan您可以使用lock(tradingSystemLock,m=>Console.WriteLine(m.ToString()),tp)将其写得更短
在一行代码中包含更多无用的内容:
.ToString()
委托
以及之后的所有内容。另外,你知道,你重新发明轮子而不是使用
lock
关键字,因为你似乎认为你可以做得更好。盲目-也许伊万只是想学习如何编码?这样的批评是非常有用的——不幸的是,你的批评并不有用。请尽量少做判断,多帮点忙?在一行代码中有更多无用的东西:
.ToString()
委托
,以及之后的所有事情。另外,你知道,你重新发明轮子而不是使用
lock
关键字,因为你似乎认为你可以做得更好。盲目-也许伊万只是想学习如何编码?这样的批评是非常有用的——不幸的是,你的批评并不有用。请尽量少评判,多帮助别人?