As Stomme poes explained your code is illegally nesting block level elements in an inline element. An anchor is an inline element and even if you change it's display to block via css the validator still sees it for what it is, an inline element.
That method that cooper linked to is my preferred method. The absolute positioned anchor just sits there quietly on it's own and covers the entire div with width and height at 100%. That takes care of dynamic heights in all browsers except IE6.
That would be messy, I don't think I could bring myself to do that.
Paul's Solution in Quiz#2 did use fixed heights for the sake of catering to IE6. In that example the anchor is still set as a block level whereas the nested span was the element that got the absolute positioning along with the defined height once again for IE6.
It is possible to do this for dynamic heights in IE6 with the AP anchor method. IE6 will not give the BG color changing on hover though since it only supports :hover on an anchor.
(Dynamic height div and anchor)
The BG color changing on hover in that example is coming from div:hover and IE6 would need the suckerfish hover script to comply.
Sadly though this is another one of those situations where IE6 requires an extra foo div with overflow:hidden on it since it will only work with height:999em; for IE6 since it chokes on height:100% on AP elements.
Once again IE spoils everything but you can give it just enough to work or bend over backwards and give it special attention if you want to support psedou hovers with a script.
Hope that helps.