Автоматические свойства и структуры не смешиваются?

apr-библиотека из проекта apache является хорошей ссылкой для этой проблемы. Он использует опрос с тайм-аутом, чтобы проверить, нарушено ли соединение другой стороны.

64
задан Community 23 May 2017 в 11:59
поделиться

3 ответа

От C# 6 вперед: это больше не проблема

<час>

Becore C# 6, необходимо назвать конструктора по умолчанию для этого для работы:

public MyStruct(int size) : this()
{
    Size = size;
}

А большая проблема здесь состоит в том, что у Вас есть изменяемая структура. Это никогда хорошая идея. Я сделал бы его:

public int Size { get; private set; }

Не технически неизменный, но достаточно близко.

С последними версиями C#, можно изменить к лучшему это:

public int Size { get; }

Это может теперь только быть присвоенным в конструкторе.

83
ответ дан Marc Gravell 23 May 2017 в 11:59
поделиться

Можно зафиксировать это первым вызовом конструктора по умолчанию:

struct MyStruct 
{
    public MyStruct(int size) : this() 
    {
        this.Size = size; // <-- now works
    }

     public int Size { get; set; }
}
10
ответ дан SO used to be good 23 May 2017 в 11:59
поделиться

Другое неясное обходное решение к этой проблеме является тем, определенным во временном файле Tuple класс в Управляемая Платформа Расширяемости (через Krzysztof KoЕєmic):

public struct TempTuple<TFirst, TSecond>
{
    public TempTuple(TFirst first, TSecond second)
    {
        this = new TempTuple<TFirst, TSecond>(); // Kung fu!
        this.First = first;
        this.Second = second;
    }

    public TFirst First { get; private set; }
    public TSecond Second { get; private set; }

(Полный исходный код от Codeplex: Tuple.cs)

я также отмечаю, что документация для CS0188 была обновлена для добавления:

, Если Вы видите эту ошибку при попытке инициализировать свойство в конструкторе структуры, решение состоит в том, чтобы изменить параметр конструктора для определения отступающего поля вместо самого свойства. Автореализованных свойств нужно избежать в структурах, потому что они не имеют никакого поля поддержки и поэтому не могут быть инициализированы всегда от конструктора.

, Таким образом, я беру это, чтобы означать, что официальное руководство состоит в том, чтобы использовать свойства старого стиля в Ваших структурах, когда Вы работаете в к этой проблеме, которая, вероятно, менее неясна (и больше readible), чем любая из других двух альтернатив, исследуемых до сих пор.

8
ответ дан Daniel Fortunov 23 May 2017 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: