# The dedoublifier, part one

Good Monday morning everyone; I hope my American readers had a lovely Thanksgiving. I sure did!

Well enough chit-chat, here’s a problem I was pondering the other day. We know that doubles introduce some “representation error” when trying to represent most numbers. The number 3/4, or 0.75 for example, can be exactly represented by a double, but the number 3/5, or 0.6, cannot.

In the previous exciting episode I ended on a cliffhanger; why did I put a loop around each wait? In the consumer, for example, I said:

```    while (myQueue.IsEmpty)
Monitor.Wait(myLock);
```

It seems like I could replace that “while” with an “if”. Let’s consider some scenarios. I’ll consider just the scenario for the loop in the consumer, but of course similar scenarios apply mutatis mutandis for the producer. Continue reading

# Logical implication

One of the early stumbling blocks people run into when learning traditional Aristotelian logic is the idea that “a false proposition implies any proposition”. Let’s briefly review material implication, and then I’ll talk about what the implications of material implication are to programming.

# When would you use & on a bool?

UPDATE: A commenter points out that today is the 200th anniversary of the birth of George Boole; I had no idea when I scheduled this article that it would be so apropos. Happy birthday George Boole!

Here’s a little-known and seldom-used fact about C# operators: you can apply the `&` and `|` operators to `bool`s, not just to integers. The `&` and `|` operators on `bool`s differ from `&&` and `||` in only one way: both operators always “eagerly” evaluate both operands. This is in marked contrast to the “lazily” computed evaluation of the `&&` and `||` operators, which only evaluate their right hand argument if needed. Why on earth would you ever want to evaluate the right hand side if you didn’t need to? Why have this operation at all on `bool`s?

A few reasons come to mind. First, sometimes you want to do two operations, and know whether both of them succeeded: Continue reading

# Optimizing associative operations

A question I occasionally get is, suppose I have code like this:

```const double x = 200.0;
const double y = 0.5;
...
void M(double z)
{
double r = z * x * y;
...
```

Does the compiler generate code as though you’d written `z * 100.0`?

# Inferring from “is”, part two

In part one I gave a bunch of reasons to reject the proposed feature where the compiler infers additional type information about a local variable when inside the consequence of a conditional statement:

```if (animal is Dog)
{
animal.Bark();
}
```

But the problem still remains that this is a fairly common pattern, and that it seems weird that the compiler cannot make the necessary inference.

A number of readers anticipated my denouement and made some of the same proposals I was going to make in this part. Let’s go through a few of them; see the comments to the previous article for a few more.

# It’s still essential

I am excited to announce that Essential C# 6.0 is now available in stores!

As always, Mark did the vast majority of the work. And as always, I was delighted to be asked once again to contribute to one of my favourite C# books. The title is well-chosen; it really does give the essentials.

Mark and I are both cyclists (though he is in a lot better shape than I am!) and so I also love that every edition has gotten more and more bicycle on the cover:

# Inferring from “is”, part one

In last week’s episode of FAIC I was discussing code of the form:

```if (animal is Dog)
((Dog)animal).Bark();
```

Specifically, why the cast was illegal if the variable tested was of generic parameter type. Today I want to take a bit of a different tack and examine the question “why do we need to insert a cast at all?” After all, the compiler should know that within the consequence of the `if`, the variable `animal` is guaranteed to be of type `Dog`. (And is guaranteed to be non-null!) Shouldn’t the code simply be:

```if (animal is Dog)
animal.Bark();
```

# Casts and type parameters do not mix

Here’s a question I’m asked occasionally:

```void M<T>(T t) where T : Animal
{
// This gives a compile-time error:
if (t is Dog)
((Dog)t).Bark();
// But this does not:
if (t is Dog)
(t as Dog).Bark();
}
```

What’s going on here? Why is the cast operator rejected? The reason illustrates yet again that the cast operator is super weird.