2016-06-06 4 views
0

мне нужно постепенно увеличивать идентификатор GUID, который я успешно достигнута при использовании thisDefining оператор инкремента для GUID

Но теперь, я хочу сделать это через оператора инкремента ++, потому что я хочу, чтобы мой код, чтобы выглядеть довольно и кратким.

Мой код:

public class GuidOps 
{ 
    public static Guid operator ++(Guid input) 
    { 
     return input.Increment(); //Increment works as intended here 
    } 
} 

Это не работает, потому что тип требуется для оператора ++ должен тип класса, в котором объявлен оператор.

enter image description here

Очевидно, что я не могу отменить заявление самого

GUID Как вы думаете, можно определить ++ на GUIDs?

+1

Зачем вам нужно увеличить 'Guid'? Какой прецедент для этого? – Sean

+1

Не делайте этого ... это путаное поведение и совершенно неожиданно. Гиды не являются инкрементным типом и переопределяют его вне причудливого. Обратите внимание, что ** довольно ** и ** краткое ** приемлемо только в контексте ** читаемых ** и ** поддерживаемых **. –

ответ

1

это невозможно сделать причина GUID является запечатанной структурой

1

Потому что Guid запечатан, единственный способ сделать что-то даже удаленно близко к этому - создать обертку, которая, в свою очередь, обновит свойство Guid на обертке. Однако в нем есть несколько отказов от ответственности ...

  1. Это ужасно запутанное и немое. Не делай этого. Ничего подобного в этом отношении не ожидается или разумно. Это приведет к проблемам ремонтопригодности
  2. Это все еще фактически не добавляет оператор инкремента в определение Guid; он только добавляет оператор в оболочку. Теперь мы добавили абстракцию для абстракции и ничего не решили. Код менее читабельен.

Тем не менее, следующее поможет вам закрыть, по крайней мере, переопределение оператора и указать на проблемы, которые возникают от попыток сделать код слишком умна:

public class GuidWrapper 
{ 
    public Guid GuidInstance { get; set; } = Guid.NewGuid(); 

    public static GuidWrapper operator ++(GuidWrapper input) 
    { 
     input.GuidInstance = input.GuidInstance.Increment(); 
     return input; 
    } 
} 

var wrapper = new GuidWrapper(); 
var guid = wrapper.GuidInstance; 
var guid2 = wrapper++.GuidInstance;