<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>jaredpar's WebLog : FxCop</title><link>http://blogs.msdn.com/jaredpar/archive/tags/FxCop/default.aspx</link><description>Tags: FxCop</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Tuples Part 8: Finishing up</title><link>http://blogs.msdn.com/jaredpar/archive/2008/01/27/tuples-part-8-finishing-up.aspx</link><pubDate>Mon, 28 Jan 2008 05:37:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7278167</guid><dc:creator>Jared Parsons</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jaredpar/comments/7278167.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jaredpar/commentrss.aspx?PostID=7278167</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jaredpar/rsscomments.aspx?PostID=7278167</wfw:comment><description>&lt;p&gt;There are only a few missing features from our tuple implementation.&amp;#160; Mainly FxCop compliance, debugging support and test case code.&amp;#160; The actual functional work is complete.&amp;#160; &lt;/p&gt;  &lt;p&gt;The one issue with FxCop compliance is the chosen names.&amp;#160; Namely using A,B etc.&amp;#160; FxCop, rightly, believes names should have more value.&amp;#160; Accordingly, calling the generic argument corresponding to A, TA also causes the same issue.&amp;#160; This is a design decision made from the &lt;a href="http://blogs.msdn.com/jaredpar/archive/2008/01/03/tuples-part-1.aspx"&gt;begining&lt;/a&gt;.&amp;#160; I don't believe changing the name to ValueA adds any more value than simply A.&amp;#160; Therefore the warning for this will simply be suppressed. &lt;/p&gt;  &lt;p&gt;Additionally FxCop doesn't like types with more than 3 generic parameters.&amp;#160; This is also a design decision intentionally done and there is no avoiding it.&amp;#160; It will be suppressed as well.&amp;#160; &lt;/p&gt;  &lt;p&gt;For debugging support a simple &lt;a href="http://msdn2.microsoft.com/en-us/library/x810d419.aspx"&gt;DebuggerDisplay attribute&lt;/a&gt; will be used.&amp;#160; It will display the current value of all of the tuple values.&amp;#160; &lt;/p&gt;  &lt;p&gt;Here is the latest version of the full script which includes all of the new information.&amp;#160; With the exception of a few small tweaks this is just the combination of the individual parts specified throughout these postings.&lt;/p&gt;  &lt;p&gt;param ( [int]$tupleCount = 5,   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [string]$namespace = &amp;quot;Tuples&amp;quot; ) &lt;/p&gt;  &lt;p&gt;$script:scriptPath = split-path -parent $MyInvocation.MyCommand.Definition    &lt;br /&gt;$script:lowerList = 0..25 | %{ [char]([int][char]'a'+$_) }    &lt;br /&gt;$script:upperList = 0..25 | %{ [char]([int][char]'A'+$_) }    &lt;br /&gt;$script:valueList = &amp;quot;1&amp;quot;,&amp;quot;42&amp;quot;,'&amp;quot;bar&amp;quot;', '&amp;quot;foo&amp;quot;', 'true' &lt;/p&gt;  &lt;p&gt;function script:Gen-FxCop   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int]$code ) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; switch ( $code )   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1704 { '[SuppressMessage(&amp;quot;Microsoft.Naming&amp;quot;, &amp;quot;CA1704&amp;quot;)]'; break }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1005 { '[SuppressMessage(&amp;quot;Microsoft.Design&amp;quot;, &amp;quot;CA1005&amp;quot;)]'; break }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default: {$(throw &amp;quot;Invalid&amp;quot;)}    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-Display   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int]$count )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = &amp;quot;, &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $p = [string](0..($count-1) | %{ &amp;quot;{0}={{{0}}}&amp;quot; -f $upperList[$_] })    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; '[DebuggerDisplay(&amp;quot;{0}&amp;quot;)]' -f $p    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-Property   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $index&amp;#160; = $(throw &amp;quot;Need an index&amp;quot;), [bool]$mutable = $false) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (-not $mutable )   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;@&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private readonly T{0} m_{1};    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $(Gen-FxCop 1704)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public T{0} {0} {{ get {{ return m_{1}; }} }} &lt;/p&gt;  &lt;p&gt;&amp;quot;@ -f $upperList[$index],$lowerList[$index]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;@&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private T{0} m_{1};    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $(Gen-FxCop 1704)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public T{0} {0} {{ get {{ return m_{1}; }} set {{ m_{1} = value; }} }} &lt;/p&gt;  &lt;p&gt;&amp;quot;@ -f $upperList[$index],$lowerList[$index]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-Constructor   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;), [string]$className )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = ','    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $list = [string](0..$($count-1) | %{ &amp;quot;T{0} value{0}&amp;quot; -f $upperList[$_]})    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public $className($list) {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 0..($count-1) | %{ &amp;quot;m_{0} = value{1};&amp;quot; -f $lowerList[$_],$upperList[$_] }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-InferenceConstructor   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;), [string]$name )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = ','    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $gen = &amp;quot;&amp;lt;&amp;quot; + [string](0..($count-1) | %{ &amp;quot;T&amp;quot;+$upperList[$_] }) + &amp;quot;&amp;gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $list = [string](0..$($count-1) | %{ &amp;quot;T{0} value{0}&amp;quot; -f $upperList[$_] })    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $argList = [string](0..$($count-1) | %{ &amp;quot;value{0}&amp;quot; -f $upperList[$_] })    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public static partial class $name {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-FxCop 1704    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public static $name$gen Create$gen($list) { return new $name$gen($argList); } &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-Equals   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;), [string]$name )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = ','    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $gen = &amp;quot;&amp;lt;&amp;quot; + [string](0..($count-1) | %{ &amp;quot;T&amp;quot;+$upperList[$_] }) + &amp;quot;&amp;gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public override bool Equals(object obj) { &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return Equals(obj as $name$gen); }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public bool Equals($name$gen other) {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;if ( Object.ReferenceEquals(other,null) ) { return false; }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;if (&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = &amp;quot;&amp;amp;&amp;amp;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [string](0..($count-1) | %{&amp;quot;EqualityComparer&amp;lt;T{0}&amp;gt;.Default.Equals(m_{1},other.m_{1})&amp;quot; -f $upperList[$_],$lowerList[$_] })    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;) { return true; }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return false;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-GetHashCode   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;) )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public override int GetHashCode() {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;int code = 0;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 0..($count-1) | %{ &amp;quot;code += EqualityComparer&amp;lt;T{0}&amp;gt;.Default.GetHashCode(m_{1});&amp;quot; -f $upperList[$_],$lowerList[$_] }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return code;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-ITuple   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;) )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = ','    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $gen = &amp;quot;&amp;lt;&amp;quot; + [string](0..($count-1) | %{ &amp;quot;T&amp;quot;+$upperList[$_] }) + &amp;quot;&amp;gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $base = &amp;quot;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if ( $count -ne 1 )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $baseGen = &amp;quot;&amp;lt;&amp;quot; + [string](0..($count-2) | %{ &amp;quot;T&amp;quot;+$upperList[$_] }) + &amp;quot;&amp;gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $base = &amp;quot;: ITuple$baseGen&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $base = &amp;quot;: ITuple&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-FxCop 1704    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if ( $count -gt 2 ) { Gen-FxCop 1005 }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public interface ITuple$gen $base {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-FxCop 1704    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;T{0} {0} {{ get; }}&amp;quot; -f $upperList[$count-1]&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-TupleAccess   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;), [bool]$mutable )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public int Count { get { return $count; } }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public object this[int index] { get { switch (index){ &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 0..($count-1) | %{ &amp;quot;case $($_): return m_$($lowerList[$_]);&amp;quot; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;default: throw new InvalidOperationException(&amp;quot;&amp;quot;Bad Index&amp;quot;&amp;quot;);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;} }&amp;quot; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if ( $mutable )   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;set { switch (index) {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0..($count-1) | %{ &amp;quot;case $($_): m_$($lowerList[$_]) = (T$($upperList[$_]))value; break;&amp;quot; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;default: throw new InvalidOperationException(&amp;quot;&amp;quot;Bad Index&amp;quot;&amp;quot;);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;} } &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-OpEquals   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;), [string]$name )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = ','    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $gen = &amp;quot;&amp;lt;&amp;quot; + [string](0..($count-1) | %{ &amp;quot;T&amp;quot;+$upperList[$_] }) + &amp;quot;&amp;gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public static bool operator==($name$gen left, $name$gen right) {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return EqualityComparer&amp;lt;$name$gen&amp;gt;.Default.Equals(left,right); }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public static bool operator!=($name$gen left, $name$gen right) {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return !EqualityComparer&amp;lt;$name$gen&amp;gt;.Default.Equals(left,right); }&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Gen-CompareTo   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count = $(throw &amp;quot;Need a count&amp;quot;), [string]$name )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = ','    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $gen = &amp;quot;&amp;lt;&amp;quot; + [string](0..($count-1) | %{ &amp;quot;T&amp;quot;+$upperList[$_] }) + &amp;quot;&amp;gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public int CompareTo(object obj) {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return CompareTo(obj as $name$gen); }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public int CompareTo($name$gen other) {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;if ( Object.ReferenceEquals(other,null) ) { return 1; }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;int code;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 0..($count-1) |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; %{ &amp;quot;code = Comparer&amp;lt;T{0}&amp;gt;.Default.Compare(m_{1},other.m_{1}); if (code != 0) {{ return code; }}&amp;quot; -f $upperList[$_],$lowerList[$_] }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return 0; }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public static bool operator&amp;gt;($name$gen left, $name$gen right) { &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return Comparer&amp;lt;$name$gen&amp;gt;.Default.Compare(left,right) &amp;gt; 0; }&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public static bool operator&amp;lt;($name$gen left, $name$gen right) { &amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;return Comparer&amp;lt;$name$gen&amp;gt;.Default.Compare(left,right) &amp;lt; 0; }&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function script:Get-Tuple   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; param ( [int] $count, [bool]$mutable = $false )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = ','    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $gen = &amp;quot;&amp;lt;&amp;quot; + [string](0..($count-1) | %{ &amp;quot;T&amp;quot;+$upperList[$_] }) + &amp;quot;&amp;gt;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-FxCop 1704    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-Display $count    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if ( $count -gt 2 ) { Gen-FxCop 1005 }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $name = &amp;quot;{0}Tuple&amp;quot; -f (Get-Ternary $mutable &amp;quot;Mutable&amp;quot; &amp;quot;&amp;quot;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public sealed class $name$gen : ITuple$gen,IEquatable&amp;lt;$name$gen&amp;gt;, IComparable&amp;lt;$name$gen&amp;gt;,IComparable {&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (0..($count-1) | %{ Gen-Property $_ $mutable})    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-Constructor $count $name    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-TupleAccess $count $mutable    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-Equals $count $name    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-GetHashCode $count    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-OpEquals $count $name    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-CompareTo $count $name    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Gen-InferenceConstructor $count $name    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function Gen-TestTuple([int]$count, [string]$prefix)   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $OFS = &amp;quot;,&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $v = [string](0..($count-1) | %{ $valueList[$_]} )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;[TestMethod]&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public void {0}Access{1}() {{&amp;quot; -f $prefix,$count    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;var t = $prefix.Create($v);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for ( $i = 0; $i -lt $count; ++$i )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Assert.AreEqual({0},t.{1});&amp;quot; -f $valueList[$i],$upperList[$i];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;[TestMethod]&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public void {0}GenericAccess{1}() {{&amp;quot; -f $prefix,$count    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;var t = $prefix.Create($v);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for ( $i = 0; $i -lt $count; ++$i )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&amp;quot;Assert.AreEqual({0},t[{1}]);&amp;quot; -f $valueList[$i],$i);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Assert.AreEqual({0},t.Count);&amp;quot; -f $i     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;[TestMethod]&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public void {0}Equals{1}() {{&amp;quot; -f $prefix,$count    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;var t1 = $prefix.Create($v);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;var t2 = $prefix.Create($v);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Assert.IsTrue(t1.Equals(t2));&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;[TestMethod]&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public void {0}NotEquals{1}() {{&amp;quot; -f $prefix,$count    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; for ( $i = 0; $i -lt $count; ++$i )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $leftName = &amp;quot;t{0}_1&amp;quot; -f $i    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $rightName = &amp;quot;t{0}_2&amp;quot; -f $i    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $left = &amp;quot;var $leftName = $prefix.Create(&amp;quot; -f $i    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $right = &amp;quot;var $rightName = $prefix.Create(&amp;quot; -f $i    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for ( $v = 0; $v -lt $count; ++$v )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $left += &amp;quot;$v&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( $v -eq $i )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $right += &amp;quot;-1&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $right += &amp;quot;$v&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ( ($v + 1) -lt $count )   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $left += &amp;quot;,&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $right += &amp;quot;,&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;$left);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;$right);&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Assert.AreEqual($leftName.GetType(), $rightName.GetType());&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Assert.IsFalse($leftName.Equals($rightName));&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;[TestMethod]&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;public void {0}CompareTest() {{ &amp;quot; -f $prefix    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Assert.IsTrue($prefix.Create(1) &amp;lt; $prefix.Create(2));&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Assert.IsTrue($prefix.Create(2) &amp;gt; $prefix.Create(1));&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;}&amp;quot;    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;$output =    &lt;br /&gt;@&amp;quot;    &lt;br /&gt;using System;    &lt;br /&gt;using System.Collections.Generic;    &lt;br /&gt;using System.Diagnostics;    &lt;br /&gt;using System.Diagnostics.CodeAnalysis; &lt;/p&gt;  &lt;p&gt;namespace $namespace {    &lt;br /&gt;public interface ITuple {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int Count { get; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; object this[int index] { get; }    &lt;br /&gt;}    &lt;br /&gt;&amp;quot;@    &lt;br /&gt;$OFS = [Environment]::NewLine    &lt;br /&gt;$output += [string](0..($tupleCount-1) | %{ Gen-ITuple ($_+1) })    &lt;br /&gt;$output += [string](0..($tupleCount-1) | %{ Get-Tuple ($_+1) })    &lt;br /&gt;$output += [string](0..($tupleCount-1) | %{ Get-Tuple ($_+1) $true })    &lt;br /&gt;$output += &amp;quot;}&amp;quot; &lt;/p&gt;  &lt;p&gt;$output &amp;gt; (join-path $scriptPath &amp;quot;Core\Tuple.cs&amp;quot;) &lt;/p&gt;  &lt;p&gt;$output =    &lt;br /&gt;@&amp;quot;    &lt;br /&gt;using System;    &lt;br /&gt;using System.Collections.Generic;    &lt;br /&gt;using Microsoft.VisualStudio.TestTools.UnitTesting;    &lt;br /&gt;using $namespace; &lt;/p&gt;  &lt;p&gt;namespace $($nameSpace)Test { &lt;/p&gt;  &lt;p&gt;[TestClass]   &lt;br /&gt;public class TupleTest{    &lt;br /&gt;&amp;quot;@    &lt;br /&gt;$output += Gen-TestTuple $tupleCount &amp;quot;Tuple&amp;quot;    &lt;br /&gt;$output += Gen-TestTuple $tupleCount &amp;quot;MutableTuple&amp;quot;    &lt;br /&gt;$output += &amp;quot;}}&amp;quot;    &lt;br /&gt;$output &amp;gt; (join-path $scriptPath &amp;quot;TestCore\TupleTest.cs&amp;quot;) &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7278167" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jaredpar/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://blogs.msdn.com/jaredpar/archive/tags/FxCop/default.aspx">FxCop</category><category domain="http://blogs.msdn.com/jaredpar/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/jaredpar/archive/tags/Generics/default.aspx">Generics</category><category domain="http://blogs.msdn.com/jaredpar/archive/tags/Tuple/default.aspx">Tuple</category></item><item><title>CoSetProxyBlanket and Managed Code</title><link>http://blogs.msdn.com/jaredpar/archive/2007/04/19/cosetproxyblanket-and-managed-code.aspx</link><pubDate>Thu, 19 Apr 2007 19:15:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2193730</guid><dc:creator>Jared Parsons</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/jaredpar/comments/2193730.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jaredpar/commentrss.aspx?PostID=2193730</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jaredpar/rsscomments.aspx?PostID=2193730</wfw:comment><description>&lt;p&gt;When running FxCop on any managed code&amp;nbsp;that uses CoSetProxyBlanket you will see an error message saying the method cannot be called reliably from managed code.&amp;nbsp; I've hit that message before was frustrated by my attempts to find an explanation on the web.&amp;nbsp; Part of the reason is I'm not the most efficient searcher on the web.&amp;nbsp; &lt;/p&gt; &lt;p&gt;However and internal discussion revealed to me a great blog entry explaining exactly why this is unreliable and more importantly how to work around the issue.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/mbend/archive/2007/04/18/cosetproxyblanket-not-supported-from-managed-code.aspx"&gt;http://blogs.msdn.com/mbend/archive/2007/04/18/cosetproxyblanket-not-supported-from-managed-code.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:88620b15-bace-49fa-adf7-f99781def9fa" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/DotNet" rel="tag"&gt;DotNet&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2193730" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jaredpar/archive/tags/DotNet/default.aspx">DotNet</category><category domain="http://blogs.msdn.com/jaredpar/archive/tags/FxCop/default.aspx">FxCop</category><category domain="http://blogs.msdn.com/jaredpar/archive/tags/Security/default.aspx">Security</category></item></channel></rss>