Analysis describing the combination of cards In this class, the order of the last 3 statements in the constructor is important. If you call OrderedCards = OrderCards(cards, wildcardsCount); last, it will crash with NRE.

Is this a bad idea? If so, how should I fix it?

/// &lt;summary&gt;
/// The abstract result of analysis describing the combination of cards
/// &lt;/summary&gt;
public abstract class TichuTrick
{

    public List&lt;CardData&gt; OrderedCards { get; private set; }
    public readonly int CardCount;
    public readonly int TrickValue;
    public readonly int HighestCardValue;
    public readonly int WildcardsCount;

    /// &lt;summary&gt;
    /// Constructs a response of analysis
    /// &lt;/summary&gt;
    /// &lt;param name="cards"&gt;This class works only with 1 wildcard in each trick.&lt;/param&gt;
    internal TichuTrick(List&lt;CardData&gt; cards, int cardCount, int wildcardsCount)
    {
        if (wildcardsCount &gt; 1)
        {
            throw new System.ArgumentException("More than one wildcards support, is not yet implemented", nameof(wildcardsCount));
        }
        CardCount = cardCount;
        OrderedCards = OrderCards(cards, wildcardsCount);
        TrickValue = CalculateTrickValue();
        HighestCardValue = CalculateHighestCardValue();
    }

    protected virtual List&lt;CardData&gt; OrderCards(List&lt;CardData&gt; cards, int WildcardCount)
    {
        return cards.OrderBy(x =&gt; x.NumericalValue).ToList().CopyList();
    }

    protected virtual int CalculateTrickValue()
    {
        return CalculateHighestCardValue();
    }

    protected virtual int CalculateHighestCardValue()
    {
        return OrderedCards.Last().NumericalValue;
    }

}
The order is not the problem here but rather the fact that you have multiple virtual calls in your constructor. This is really bad because in your derived class, when they are being instantiated, your constructor will first call the base implementation of the virtual functions your base class constructor, which might result  in unexpected behaviour form t he virtual functions.

Also you shouldn't be using fields, use properties instead.

Here is how you can avoid all of your current issues : 

public abstract class TichuTrick
{
    private readonly List&lt;CardData&gt; _cards;
    public List&lt;CardData&gt; OrderedCards =&gt; OrderCards(_cards, WildcardsCount);

    public int CardCount { get; }

    public int TrickValue =&gt; CalculateTrickValue();
    public int HighestCardValue =&gt; CalculateHighestCardValue();
    public int WildcardsCount { get; }

    internal TichuTrick(List&lt;CardData&gt; cards, int cardCount, int wildcardsCount)
    {
        if (wildcardsCount &gt; 1)
        {
            throw new System.ArgumentException("More than one wildcards support, is not yet implemented", nameof(wildcardsCount));
        }
        CardCount = cardCount;
        _cards = cards;
        WildcardsCount = wildcardsCount;
    }

    protected virtual List&lt;CardData&gt; OrderCards(List&lt;CardData&gt; cards, int WildcardCount)
    {
        return cards.OrderBy(x =&gt; x.NumericalValue).ToList().CopyList();
    }

    protected virtual int CalculateTrickValue()
    {
        return CalculateHighestCardValue();
    }

    protected virtual int CalculateHighestCardValue()
    {
        return OrderedCards.Last().NumericalValue;
    }
}


I also don't think this parameter should be a parameter at all cardCount you can access the card count from the array, but since I'm not 100% sure that this is correct I left it there.