Как изменить имена стандартных ключевых слов в C#

у меня есть интересная идея. Я хочу переопределить ключевые слова в C#, например заменить if ключевые слова MyIf или что-то еще. Кто-нибудь знает, как это сделать?

как я думаю, это должно выглядеть примерно так:

namespace
{
   #define MyIf = if;
   #define MyElse = else;
   ...

   public someclass
   {
        public void someMethod()
        {
            MyIf(true)
            {
               ...
            }
            MyElse
            {
               ...
            }
        }
   }
}

добавлено:

может быть, есть способ, как сделать на C++ или C библиотека, которая переопределит часть стандартного ядра C#?

**обратите внимание. Я знаю, что это плохой практикой программирования, и я прошу всех программистов не использовать ответ в ваш ОКПО. **

7 ответов


Это невозможно -- C# не имеет препроцессора, такого как C и C++, поэтому нет механизма преобразования источника до того, как компилятор его увидит. И, конечно же, компилятор распознает только стандарт if, поэтому нет и другого варианта, который каким-то образом преобразует источник до того, как компилятор его увидит.


в c# вы можете переопределить перегружаемые операторы (+ , - , ==) дополнительная информация здесь:http://msdn.microsoft.com/en-us/library/8edha89s (v=против 80).aspx

а вы Не могу действительно переопределить условные операторы.

то же самое касается этих операторов =, ., ?:,- > , new, is, sizeof, typeof, они не могут быть перегружены.

C# не поддерживает макросы, но, конечно, вы можете написать пользовательский парсер, который обрабатывает макросы перед отправкой кода компилятору c#, взгляните на Microsoft Roslyn для этого.

http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx


можно использовать монады С extension methods вот так...

это монада может быть

    public static TInput If<TInput>(this TInput o, Predicate<TInput> evaluator)
        where TInput : class
    {
        if (o == null) return null;
        return evaluator(o) ? o : null;
    }

        public static TResult Return<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator, TResult failureValue)
            where TInput : class
        {
            if (o == null) return failureValue;

            return evaluator(o);
        }

// использование

var result = ListOfObjects.If(o => o.Id == 1).Return(x => x.Object, null);

вы не можете переопределить if или else, потому что у C# нет препроцессора, который позволил бы вам сделать что-то подобное (вероятно, также, чтобы предотвратить подобные вещи).

но вы можете переопределить, когда экземпляры ваших классов оцениваются в true/false (это самое близкое, что вы можете получить):

public static bool operator true(YourType x)
{
    return x.IsLying ? !x.Whatever : x.Whatever;
}

public static bool operator false(YourType x)
{
    return x.IsLying ? x.Whatever : !x.Whatever;
}

пример:

YourType wah = new YourType() { IsLying = true, Whatever = true };
if (wah) {
    // ...
}
else {
    // ...
}

Подробнее см. здесь подробности:
http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx


C# #define

#define позволяет определить символ, такой, что, используя символ в качестве выражения, переданного директиве #if, выражение будет равно true.

C# не имеет препроцессора, но он так и директивы:

хотя компилятор не имеет отдельного препроцессора, директивы, описанные в этом разделе, обрабатываются так, как если бы быть одним. Они используются для помощи в условной компиляции. в отличие от директив C и c++, вы не можете использовать эти директивы для создания макросов.

таким образом, это не то же самое #define как в C++ или C. C# #define только состояния, что существует литерал, но нет замены или макроса для этого литерала.

#define STRING int // Valid in C++ but invalid in C#

C++ #define

директива #define заменяет токен-строку для всех последующие вхождения идентификатора в исходный файл. Идентификатор заменяется только тогда, когда он формирует токен. (См. раздел маркеры C++ в Справочнике по языку C++.) Например, идентификатор не заменяется, если он появляется в комментарии, в строке или как часть более длинного идентификатора.


В C# директивы препроцессора существуют для условно-компиляции кода.

например:

#define позволяет определить символ. При использовании символа в качестве выражения, которое передается в


сделайте что-то похожее на то, что вы хотите, вы можете переопределить неявный оператор bool:

using System;

class PleaseDontDoThis {
    public static implicit operator bool(PleaseDontDoThis h) {
        return (new Random().Next() % 2 == 0);
    }
}

static class Program {
    static void Main(string[] args) {
        var x = new PleaseDontDoThis();
        if (x) {
            Console.WriteLine("true");
        } else {
            Console.WriteLine("false");
        }
    }
}