// subject
class SafeMode
{
private bool m_enable = false;
public bool Disable()
{
return m_enable;
}
public delegate void NotifyObserversHandler(bool _status);
public event NotifyObserversHandler DiableCommands;
public void Notify()
{
DiableCommands(m_enable);
}
}
public interface ICommand
{
void Execute(User i_User, string i_ButtonText, List<Photo> o_Photos);
void DiableFunctionality();
}
// my only observer
public class MostPopularPic : ICommand
{
public void DisableFunctionality()
{
m_enable = false;
}
}
// at other form class that's where i attach my observer to the delegate and the error occurs.
foreach( KeyValuePair<string,ICommand> runner in tmp)
{
ICommand curr = runner.Value;
m_safer.DiableCommands += curr.DiableFunctionality();
// faild to convert 'void' to 'SafeMode.NotifyObserversHandler'
}

Look at this statement:
m_safer.DiableCommands += curr.DiableFunctionality();
That's trying to invoke curr.DiableFunctionality and then subscribe the result of the method call to the m_safer.DiableCommands event.
You don't want to invoke the method now - you just want to convert the method group to a delegate, and subscribe that delegate. So you want:
m_safer.DiableCommands += curr.DiableFunctionality;
That will still have a problem though - your DiableFunctionality method is parameterless, whereas your NotifyObserversHandler delegate has a bool parameter. If you want to just ignore that parameter, you could use:
m_safer.DiableCommands += ignored => curr.DiableFunctionality();
This now uses a lambda expression which takes a single parameter (ignored) and ignores it, just calling curr.DiableFunctionality().
See more on this question at Stackoverflow