Firstly, you could make it much easier:
MyConfusingEnum x1 = 0; MyConfusingEnum x2 = default(MyConfusingEnum); MyConfusingEnum x3 = new MyConfusingEnum(); MyConfusingEnum x4 = (MyConfusingEnum) 123;
all of the above works just fine. (You may be surprised that the first one works; see the section on implicit enumeration conversions for details.)
My question is why does the compiler allow an empty definition
I'll start by answering a question with a question. Could you also give up the compiler?
class C {} interface I {} struct S {}
Why or why?
In order not to directly answer your question: "Why is the world not different from it?" questions are hard to answer. Instead of answering this unresolved question, I will answer the question "suppose that for empty listings a mistake was made in the design team, how would you answer this step?" This question is still controversial, but at least it is one that I can answer.
The question then becomes whether the value of this function is justified by its benefits.
In order to work in the language, it is necessary to take into account, design, indicate, verify, test, document and send to customers. This is a "make a mistake" function, so the error message must be recorded and translated into several dozen languages, as well as the documentation. The five minutes that it would take me to implement this function went over the many hours of work of many people who are paid quite a lot.
However, this is actually not a significant cost. opportunity cost is the corresponding value. Budgets are finite, functions are not free, and therefore any implemented function means that you need to cut off another function; What C # function would you like to shorten to get this function? The lost benefit of not being able to make a better function is opportunity costs.
I also note that your proposed feature has zero obvious benefit for everyone, which would make it a tough sale to the project committee. Perhaps there is an irresistible benefit that I do not see; if so, what is it?
Are there any scenarios where this might be useful?
No one comes to mind. "Giving up programs that are clearly not useful" is not the purpose of developing C #.