A lot (all?) of the answers are saying to throw an exception, but I'm sure I've seen official statements from the framework design team advising against throwing exceptions from constructors.
Note that the classes in the .NET framework that behave similarly to your "Banana" example (where only certain values are appropriate to instantiate the object with) don't use constructors, but instead use static factory methods. For example, System.Net.WebRequest has no public constructor, and instead uses a static Create method which can raise an exception if the supplied string is not a valid URI. With some exceptions - see my update below.
So for your code I would change Banana's constructor to protected, and introduce a method like this:
public static Banana Create(string color)
{
if (color != "green" && color != "yellow")
{
throw new ArgumentException("Color must be 'green' or 'yellow'",
"color");
}
return new Banana(color);
}
Update
Ok, it seems like it's not a bad idea to throw exceptions from a constructor. In fact, System.IO.FileStream does just that if you pass an invalid filename to its constructor. I guess the idea of using a static factory method is just one way of being more explicit about how you're creating the instance (for example, if the method above were called "FromColor").