Wrapping tuples to be used as keys in a Dictionary
public Key(string unitID, int address, int comPort, int id)



Clearly this class represents something much more specialized than an all-purpose "key". Name the type for what it stands for!


private Tuple&lt;string, int, int, int&gt; _impl;



The private field should be readonly. But why don't you have this instead?

private readonly string _unitId;
private readonly int _address;
private readonly int _comPort;
private readonly int _id;



public override int GetHashCode() 
{
    return _impl.GetHashCode(); 
}



Ideally your GetHashCode implementation should rely on immutable fields. Your _impl field isn't marked readonly, which doesn't quite communicate that intent. Using actual fields and dropping the Tuple altogether, you can come up with a more standard GetHashCode implementation.


  That way I should take advantage of the Tuple class and avoid its inconvenients.


You're not getting anything out the Tuple. Get rid of it, it's only obfuscating the class' implementation.



Also, you're not instantiating your Tuple the idiomatic way. This:


_impl = new Tuple&lt;string, int, int, int&gt;(unitID, address, comPort, id);



Should be written like this and leverage generic type parameter inference:

_impl = Tuple.Create(unitID, address, comPort, id);