Errata

C# 4.0 in a Nutshell

Errata for C# 4.0 in a Nutshell

Submit your own errata for this product.

The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".

The following errata were submitted by our customers and approved as valid errors by the author or editor.

Color key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted By Date submitted Date corrected
Printed
Page 15
top, first paragraph

text refers to the "Test" class in the code on page 15.

second line of text in the paragraph: "the Test class could not access it."

in the code on page 15, there is no Test class - the class is called "Program"

Note from the Author or Editor:
In the code sample, change "class Program" to "class Test".

joseph wyatt  Oct 21, 2010  Jun 03, 2011
Printed
Page 18
2nd paragraph

The sentence "If we repeat the previous example, but with Point now a class, an operation to X affects Y:" is a bit misleading.

It should probably read "If we repeat the previous example, but with Point now a class, an operation to p1 affects p2:"

Jonas Collberg  May 09, 2011  Jun 03, 2011
Printed
Page 27
1st paragraph in "Real Number Rounding Errors"

"float and double 1internally ..." -> "float and double internally ..."

Anonymous  Jan 11, 2011  Jun 03, 2011
Printed
Page 38
first line under table heading "Parameter modifier"

Wrong font for "None" -- it should be roman or blank as it is not a keyword.

Anonymous  Jan 11, 2011  Jun 03, 2011
Printed, PDF
Page 39 in pdf, 38 in print
2nd paragraph

"fields are implicitly assigned to a default value": the "to" should be deleted.

Note from the Author or Editor:
Agree.

richard.albury  May 01, 2011  Jun 03, 2011
Printed
Page 47
Shift operators (near the bottom of the table)

The example for the Shift Left operator uses the Shift Right operator and vice versa.

Note from the Author or Editor:
Replace "x >> 1" with "x << 1" and vice-versa.

Hanna Ruotsalainen  Nov 02, 2010  Jun 03, 2011
Printed
Page 55
Last paragraph

Instead of 'goto case-constant', it should be 'goto case case-constant', as correctly stated a few lines before.

Gorpik  Mar 09, 2010  Jun 03, 2011
Printed
Page 57
Last paragraph and example

The "previous example" mentioned is missing; probably it was edited out.

Note from the Author or Editor:
Sure - delete that sentence ("This example is semantically identical to our previous example").

Gorpik  Mar 09, 2010  Jun 03, 2011
Printed
Page 65
Last paragraph

Even thought the section is "Instance Constructors", maybe you should clarify that "Instance constructors allow the following modifiers", so it is clear that this does not apply to static constructors.

Note from the Author or Editor:
Good call - change "Constructors" to "Instance constructors" in the last paragraph of page 65.

Gorpik  Mar 09, 2010  Jun 03, 2011
Printed
Page 68
Section on Object Initializers Versus Optional Parameters

The section discusses a feature of C# 4.0, but that is not called out anywhere in the box. Also, the last line on page 67 reads, "Object Initializers were introduced in in C# 3.0.", which is correct, but is confusing when the boxed section starting on 68 discusses Object Initializers in more detail but in relation to C# 4.0 Optional Parameters.

I recommend appending "(C# 4.0)" to the title in the boxed section.

Note from the Author or Editor:
Append "(C# 4.0)" to the title in the boxed section.

Stan Morris  Mar 21, 2010  Jun 03, 2011
Printed
Page 71
First line of code

Return type for get_CurrentPrice should be decimal, not int.

Note from the Author or Editor:
Change "int" to "decimal" in first line of first code listing on page 71

Gorpik  Mar 09, 2010  Jun 03, 2011
Printed
Page 81
subheading

Replace ?new versus virtual? with ?new versus override?

Note from the Author or Editor:
Agree. Replace heading "new versus virtual" with "new versus override". Note to editors: This heading needs to be entirely in lower case, because we're referring to case-sensitive language constructs.

Howard Weisberg  Dec 19, 2010  Jun 03, 2011
Printed
Page 88
Object Member Listing

In the list of Object members, it should be:

protected virtual void Finalize();

instead of:

protected override void Finalize();

Gorpik  Mar 11, 2010  Jun 03, 2011
Printed
Page 99
list of operators in Enum Operators Section

I believe that the second - (minus) operator should be -- (decrement)

i.e. (second row of operators)
+= -= ++ -- sizeof

Note from the Author or Editor:
Yes. It should read "++ --" rather than "++ -".

guest  May 25, 2011  Jun 03, 2011
Printed
Page 106
5th paragraph

"CompareTo returns a positive number if other is greater than this" should be "CompareTo returns a positive number if this is greater than other".

Gorpik  Mar 10, 2010  Jun 03, 2011
Printed
Page 106
"Generic Constraints" section

This section explains that base class constraint and naked type constraint require the type parameter to derive from the type specified in the constraint. In fact, it can also be the type specified. AFAIK, this is the only place in C# where a class is considered to inherit from itself, so I think it should be clarified.

Note from the Author or Editor:
Yes, you're right. It will be somewhat awkward to fix this in a reprint, though (it requires restructuring the sentences to make it clear) so we'll change this in the next edition.

Gorpik  Mar 10, 2010 
Printed
Page 106
2nd paragraph

In the example code, "class GenericClass<T> where..." should read "class GenericClass<T,U> where..."

K. L. Estes  May 22, 2010  Jun 03, 2011
Printed
Page 109
Covariant example at bottom of page

The variable names are backwards. 'B', 'b' and 'S', 's' names represent 'Base' and 'Subclass' types and variables. The example uses 'b' as the name for the reference variable for an interface using the Subclass type. It should read:
IFoo<string> s = ...;
IFoo<object> b = s;

Stan Morris  Mar 28, 2010  Jun 03, 2011
Printed
Page 116
Beginning of section "Writing Plug-In Methods with Delegates"

Replace "delegatevariable" with "delegate variable".

Gorpik  Mar 11, 2010  Jun 03, 2011
Printed
Page 118
last paragraph

"When a delegate object is assigned to an instance method" -- remove the word "to", or rewrite as "When an instance method is assigned to a delegate object".

This section may be clearer if prefaced with: "The previous examples all used static target methods." (italicize "static")

This section uses the terminology "delegate object" but previous sections used "delegate instance" or "delegate variable". Perhaps "delegate variable" is better to avoid confusion with the two meanings of the word "instance" here. Or stick with "object".

Note from the Author or Editor:
Sure - remove the word 'to'.

"When a delegate object is assigned an instance method..."

Dan  Sep 05, 2010  Jun 03, 2011
Printed
Page 124
in sidebar

Complete the correction to the example code. Change

public event EventHandler Progress;

to

public event EventHandler PriceChanged;

Note from the Author or Editor:
Note that this change applies only to the code in the sidebar. The third line of the code listing should be:

public event EventHandler PriceChanged;

Anonymous  Jan 11, 2011  Jun 03, 2011
Printed
Page 124
Box

The event does not fit to the example.

False:
public event ProgressReporter Progress;

Right:
public event EventHandler PriceChanged;

Note from the Author or Editor:
In the code listing in the sidebar "How Do Events Work on the Inside?", the word "ProgressReporter" should be replaced with "EventHandler".

Anonymous  Feb 28, 2010  Mar 01, 2010
Printed
Page 152
Last code snippet

The set function in the Color property is technically correct, but I think it would not behave as expected. Instead of:

set { color = Color == parent.Color ? (Color)null : value; }

I think it should be:

set { color = value == parent.Color ? (Color)null : value; }

Gorpik  Mar 15, 2010  Jun 03, 2011
Printed
Page 152
First section, 3rd paragraph.

In the 'Null Coalescing operator' section, it is stated that the difference between using ?? and calling GetValueOrDefault with an explicit default value is that "the expression passed to GetValueOrDefault is never evaluated if the variable is not null".
This is the other way around: the expression to the right of the ?? operator is not evaluated if the left part is not null, but the expression passed to GetValueOrDefault is always evaluated.

--> should become 'the expression passed to the right of the ?? operator is never evaluated if the variable is not null'.

Note from the Author or Editor:
Change "expression passed to GetValueOrDefault" to "expression for the default value".

AlvinMinring  Mar 31, 2011  Jun 03, 2011
PDF
Page 153
2nd statement

Console.WriteLine (s); // -1

should be:

Console.WriteLine (i); // -1

Anonymous  May 17, 2010  Jun 03, 2011
Printed
Page 161
1st paragraph

The property names must also be the same for both instances to have the same underlying type.

Note from the Author or Editor:
Change the first sentence on page 161 to:

Two anonymous type instances declared within the same assembly will have the same underlying type if their elements are named and typed identically:

Gorpik  Mar 15, 2010  Jun 03, 2011
Printed
Page 165
Footnote

The conversion from dynamic 'expressions' to other types is no longer an assignment conversion but an implicit conversion. See Chris Burrows' blog post on 1 April 2010 (http://blogs.msdn.com/b/cburrows/) for details of the change.

Note from the Author or Editor:
Sure: remove the footnote from that page

Alan Fox  Jun 28, 2010  Jun 03, 2011
Printed
Page 165
First code example in section "Dynamic Conversions"

In the code example:

int i = 1;
dynamic d = i;
int j = d;

According to the next paragraph that provides description of the example, declaration of "j" variable should be of "long" type.

Note from the Author or Editor:
Change "int j" to "long j".

Michal Jakubec  Oct 31, 2010  Jun 03, 2011
Printed
Page 166
4th code snippet

The following example is used to illustrate the fact that casting a dynamic expression to a static type yield a static expression:

dynamic x = 2;
var y = (int)2;

However, '2' is not a dynamic expression, and the cast adds nothing. The second line of the example probably should have been:

var y = (int)x;

Note from the Author or Editor:
Agree.

AlvinMinring  Apr 04, 2011  Jun 03, 2011
174
First code block

The last line of code (declaring j) should have type long, otherwise the following comment "The preceding example worked because an int is implicitly convertible to a long." makes no sense.

Note from the Author or Editor:
Page 165, section "Dyanmic Conversions", first code listing.

In last line of code listing, int should be changed to long so that it reads:

long j = d;

Richard Cox  Apr 11, 2010  Jun 03, 2011
Printed
Page 175
Last paragraph in section "Conditional Attributes"

"The compiler will not incorporate..." should be "The compiler will only incorporate...".

Gorpik  Mar 15, 2010  Jun 03, 2011
Printed
Page 175
last line in Table 4-1

Change "#end 'region'" to "#endregion"

Note from the Author or Editor:
This is on page 175.

Anonymous  Jan 11, 2011 
Printed
Page 175
paragraph preceding "Pragma Warning"

Wrong font for "DEBUG".

Note from the Author or Editor:
The word 'DEBUG' should be in fixed-width font.

Anonymous  Jan 11, 2011  Jun 03, 2011
Printed
Page 209
1st paragraph in section "Text Encodings and Unicode"

The ASCII set is the first 128 (0-127) characters of the Unicode set, not the first 127.

Note from the Author or Editor:
This is on page 203 in the printed edition.

Gorpik  Mar 15, 2010  Jun 03, 2011
Printed
Page 225
2nd line

Shouldn't there be a "minus" before "one"?

And, on a meta-level, shouldn't "minus" be "negative"?

Note from the Author or Editor:
The code listing should include the word 'minus' and read:

-$123.45 in words is minus one two three point four five

Anonymous  Jan 11, 2011  Jun 03, 2011
Printed
Page 227
Table 6-3

Several results in the table are wrong.

Exponent notation: results should be 1E3 (not 1E0), 1E+3 (OK), 1.23E03 (not 1.25E03), 1.23e03 (not 1.25e03).

Section separator: results should be 15 (OK), (5) (instead of -5), zero (OK).

Literal: result should be $35 . 20c (instead of $35 . 00c).

Note from the Author or Editor:
Correct.

7th row, 4th column should start with 1E3 rather than 1E0 and the last two lines should start with 1.23..... rather than 1.25.....

Third-to-last row, 4th column should be (5) (i.e., 5 in brackets) rather than -5 and the last row, 4th column should be $35 . 20 rather than $35 . 00.

Gorpik  Mar 17, 2010  Jun 03, 2011
Printed
Page 238
3rd paragraph in section "BigInteger"

Method name is Pow, not PoW (as correctly stated in the example below).

Note from the Author or Editor:
Change "such as PoW" to "such as Pow"

Gorpik  Mar 17, 2010  Jun 03, 2011
Printed
Page 266
3rd paragraph

In the IEnumerable<T> and IDisposable section on page 266, I think all instances of IEnumerable<T> are supposed to be replaced with IEnumerator<T>. At least, that's what makes the most sense in context of the previous section (IEnumerable<T> doesn't inherit IDisposable, IEnumerator<T> does).

Note from the Author or Editor:
Change "IEnumerable<T> implements IDisposable..." to "IEnumerator<T> implements IDisposable".

BrettS  Mar 24, 2010  Jun 03, 2011
267
4th para after list of rules

Default ValueType.GetHashCode() uses only the first field of the struct for the hash value. Demonstrated:

using System;

struct Test
{
public int Num;
public string Str;
}

static class Program
{
static void Main()
{
Test t = new Test { Num = 10, Str = "" };
Console.WriteLine( t.GetHashCode() );
t.Str = "Test";
Console.WriteLine( t.GetHashCode() );
}
}

Reverse order of the fields, and different hash values result.

Note from the Author or Editor:
Replace:

"The default for structs simply performs a bitwise exclusive OR on each of the fields, which typically generates more duplicate codes than if your wrote the algorithm yourself"

With:

"The default implementation for structs is at the discretion of the runtime and may be based on every field in the struct."

Steve Love  Feb 10, 2011 
Printed
Page 283
near the middle

Change ?from the existing collecting? to ?from the existing collection.?

Howard Weisberg  Dec 19, 2010  Jun 03, 2011
Printed
Page 291
4th code listing

Comment should be fhi instead of fhk.

Gorpik  Mar 25, 2010  Jun 03, 2011
Printed
Page 291
Text before 5th listing

"We remove all the vowels from our set of characters in the following code:"

It should be "We remove all the non-vowels [...]"

Gorpik  Mar 25, 2010  Jun 03, 2011
Printed
Page 291
Text before 5th listing

Should be IntersectWith instead of IntersectsWith.

Note from the Author or Editor:
Agree.

AlvinMinring  Apr 06, 2011  Jun 03, 2011
Printed
Page 296
2nd paragraph from the end

"None of the three collections allows duplicate keys". In this section (Sorted Dictionaries), only two collections are mentioned.

A third one (the non-generic SortedList) is mentioned in a footnote, so I suspect an editing problem here.

Note from the Author or Editor:
Sure. Let's change that sentence to "Neither of these collections allows duplicate keys..."

Gorpik  Mar 26, 2010  Jun 03, 2011
Printed
Page 311
1st paragraph in section Getting Started

Tom, Dick and Harry are not variables (like names), but string literals. So they should be "Tom", "Dick" and "Harry".

Gorpik  Mar 29, 2010  Jun 03, 2011
Printed
Page 320
Last paragraph before tip

Two typos in this paragraph. In the first sentence, it should be "end" instead of "ends" (matches with "query expressions").
In the second sentence, it should be "a range variable" instead of "an range variable".

Gorpik  Mar 29, 2010  Jun 03, 2011
Printed
Page 339
3rd paragraph

The vowel-removed version is called vowelless in the code example, not v.

Note from the Author or Editor:
Correct. That paragraph should end as follows:

"... or its vowel-removed version (vowelless)."

Gorpik  Apr 05, 2010  Jun 03, 2011
Printed
Page 364
Tip

In the code snippet, replace ] with }

Note from the Author or Editor:
Sure. That line should read:

{ return true; } // Code blocks are not permitted

Gorpik  Apr 05, 2010  Jun 03, 2011
Printed
Page 373
Section Overview, last paragraph

"a range" instead of "an range".

Gorpik  Apr 05, 2010  Jun 03, 2011
Printed
Page 375
Distinct paragraph

I think Distinct actually has an overload that accepts an equality comparer that can be used instead of the default one.

Note from the Author or Editor:
Change 'Only the default equality comparer can be used for equality comparison' to 'You can optionally pass in a custom equality comparer.'

Vincent Croquette  Jan 03, 2011  Jun 03, 2011
Printed
Page 391
2nd paragraph after the tip

There is a reference to a variable (outerSeq) that has not been mentioned before. It should probably be query or custPurcharses.

Note from the Author or Editor:
Half way down page 391, change the word 'outerSeq' to 'purchaseSequence':

"...because purchaseSequence has no reference to..."

Gorpik  Apr 05, 2010  Jun 03, 2011
Printed
Page 398
1st code example

In the last line inside the foreach block, it should be " -- " instead of " - "

Gorpik  Apr 05, 2010  Jun 03, 2011
Printed
Page 399
2nd code example

The explanation says that we want to filter out groups that have fewer than five files in them, so the filter should be:
where grouping.Count() >= 5
instead of:
where grouping.Count() < 5

Gorpik  Apr 05, 2010  Jun 03, 2011
Printed, PDF
Page 400
"Concat and Union" section, 1st paragraph, 1st sentence

"Contact returns all the elements of the first sequence..."
This should be...
"Concat returns all the elements of the first sequence..."

Leonard Thieu  Aug 19, 2010  Jun 03, 2011
Printed
Page 410
5th pseudo-code fragment

Using ! to highlight the unexpected results (365!, 35!) makes them look like factorials.

Note from the Author or Editor:
Sure. Remove the exclamation marks.

Gorpik  Apr 06, 2010  Jun 03, 2011
PDF
Page 437
lower part of p.437

original sentence:
XName also overloads the + operation, allowing you to combine a namespace and name without using braces:

shoule be:
XNamespace also overloads the + operation, allowing you to combine a namespace and name into XName without using braces:

reference:
Type: System.Xml.Linq.XNamespace
public static XName operator +(XNamespace ns, string localName)


Note from the Author or Editor:
Should be:

XNamespace also overloads the + operator, allowing you to combine a namespace and name into an XName without using braces:

aligado  Aug 26, 2010  Jun 03, 2011
Printed, PDF
Page 448
Last paragraph, Last sentence

"The default value for CloseInput and CloseOutput is true."

This should be...

"The default value for CloseInput and CloseOutput is false."

Leonard Thieu  Aug 19, 2010  Jun 03, 2011
Printed
Page 467
last code segment on page

(last code segment at the bottom of 467, 4th ed):

XDocument doc = XDocument.Load( ...
Xelement e = e.XPathSelectElement( ...

Last code line should be
Xelement e = doc.XPathSelectElement( ...

Note from the Author or Editor:
Replace "XElement e = e" with "XElement e = doc".

Anonymous  Oct 01, 2010  Jun 03, 2011
Printed
Page 686
3 lines from the bottom

There is an extra 'd' at the end of the line.

Delegate staticD = Delegate.CreateDelegate
(typeof (IntFunc), typeof (Program), "Square");d


Note from the Author or Editor:
Change ";d" to ";".

Larry Hutcherson  Mar 03, 2011  Jun 03, 2011
Printed
Page 719
Paragraph 2, Line 1

The compiled code in an ssembly contains almost all of the content ...
should be:
The compiled code in an assembly contains almost all of the content ...

Note from the Author or Editor:
This is on page 681 in the printed edition.

Anonymous  Mar 23, 2010  Jun 03, 2011
Printed
Page 720
3rd paragraph

By convention, their names are csn3ed

By convention, their names are prepended?

Note from the Author or Editor:
Change "csn3ed" to "prefixed".

Vincent Croquette  Mar 11, 2011  Jun 03, 2011
Printed
Page 759
The sentence before the first bullet point in the "APTCA and [SecurityTransparent]" section

This sentence states :

"To allow such calls, you must do one of two things to X:

By "X", I assume the fully trusted assembly is meant.

Note from the Author or Editor:
Confirmed: the line should read:

To allow such calls, you must do one of two things to the fully trusted assembly.

JimboT  Feb 21, 2011  Jun 03, 2011
Printed
Page 780
1st paragraph

This frustrates hackers in two ways: hashes take longer to compute, and they ??made?? not have access to the salt bytes. (may?)

Note from the Author or Editor:
Confirmed: change 'made' to 'may'

Vincent Croquette  Feb 08, 2011  Jun 03, 2011
PDF
Page 794
2nd paragraph

"If _a_ such an assembly runs in a sandbox, any Demands that it
makes are still subject to the sandbox?s permission set."

Unneeded article 'a'.

Note from the Author or Editor:
This is on page 754 in the printed edition.

Ben Monroe  May 24, 2010  Jun 03, 2011
Printed
Page 840
Last sentence of 2nd paragraph in the section "Alternatives to WaitAll and SignalAndWait"

The last sentence states :

"..., and see how Task.ContinueWithAny provides an alternative to WaitAny).

The Task class does not have a method named "ContinueWithAny". It does have various overloads of the method "ContinueWith", and has overloads of the methods "Wait", "WaitAll", and "WaitAny".

Note from the Author or Editor:
This should read: "..and see how TaskFactory?s ContinueWhenAny provides an alternative to WaitAny.)

JimboT  Feb 22, 2011  Jun 03, 2011
Printed, PDF, , Other Digital Version
Page 860
Second code listing plus last code listing on page

Second code listing on page, 4th line: property accessor should needs type declaration. Instead of:

public Expensive

it should read:

public Expensive Expensive

(the word Expensive should be repeated). The same correction should be made to last code listing on page, 4th line in code listing.

Also, on page 861, the very first line on page (code listing) should end in:

... = new Expensive();

rather than:

... = new Foo();

Joseph Albahari
Joseph Albahari
 
Aug 12, 2010  Jun 03, 2011
Printed
Page 871
Second and third sentences of first paragraph after code

The second and third sentences state :

"This means that the callback method or Tick event may fire on a different thread each time it is called. Furthermore, a Tick always fires (approximately) on time - regardless of whether the previous Tick has finished executing."

The class Timer in namespace System.Timers does not have an event named "Tick", but rather an event named "Elapsed".

The second and third sentences should therefore state :

"This means that the callback method or Elapsed event may fire on a different thread each time it is called. Furthermore, an Elapsed always fires (approximately) on time - regardless of whether the previous Elapsed has finished executing."


JimboT  Feb 22, 2011  Jun 03, 2011
Printed
Page 885
2nd sentence of last paragraph on page

The 2nd sentence states :

"... you must force merging and repartitioning of the query by calling IsParallel() again within the query:"

The name of the method is incorrect. The sentence should state :

"... you must force merging and repartitioning of the query by calling AsParallel() again within the query:"

The name of the method in bold face in the code just below this sentence is correct.

JimboT  Feb 22, 2011  Jun 03, 2011
Printed
Page 930
Just after Using Asynchronous Methods

Let?s rite a simple
should probably be
Let?s write a simple

Note from the Author or Editor:
Change "rite" to "write". ;)

Vincent Croquette  Mar 09, 2011  Jun 03, 2011
Printed
Page 936
Code listing, half way down page

The Read() method needs two edits:
1. The third parameter should be _bytesReader instead of 0
2. ContinueWith should be called with TaskContinuationOptions.NotOnFaulted|TaskContinuationOptions.AttachedToParent

Here's how the method should read:

void Read() // This will create a child task.
{
Task<int> readChunk = Task<int>.Factory.FromAsync (
_stream.BeginRead, _stream.EndRead,
_data, _bytesRead, _data.Length - _bytesRead, null,
TaskCreationOptions.AttachedToParent);

readChunk.ContinueWith (Write, TaskContinuationOptions.NotOnFaulted
| TaskContinuationOptions.AttachedToParent);
}

The same error is repeated on page 939 and should be fixed in exactly the same way.

Note that these examples have been fixed on the companion web site - and also the "asychronator" sample project.

Note from the Author or Editor:
If you're unsure how it should look, examine the code listings on the following page:
http://www.albahari.com/nutshell/cs4ch23.aspx

Look for the listing "Non-blocking server: with Tasks" and "Writing async methods". I've highlighted the changes in purple.

Note that the third parameter should be _bytesRead, not _bytesReader - or 0.

Joe

Joseph Albahari
Joseph Albahari
 
Jan 31, 2010  Mar 01, 2010
Printed
Page 1018
Index

resurrection is misprinted as resueection

Gorpik  Apr 05, 2010  Jun 03, 2011
Printed
Page 1022
ToLookup

"ToLookup query opperator" needs to be "ToLookup query operator"

BrettS  Apr 04, 2010  Jun 03, 2011