Имена свойств и классов должны быть разными


7 0

Интересный прикол в C#. Нельзя объявить свойство с таким же именем. что и имя класса. Следующий код завершится ошибкой: 

public class UniqueDiscCode
{
	System.String _UniqueDiscCode;
	public System.String UniqueDiscCode 
	{ 
		get { return _UniqueDiscCode; } 
		set { _UniqueDiscCode = value; } 
	}
}

Но ведь с точки зрения IL кода проблем не должно быть, ведь имена свойств отличаются от имен классов. Да и следующий хак позвоялет легко обойти такое простое ограничение: 

public class DiscCodeBase 
{
 System.String _UniqueDiscCode;
 public System.String UniqueDiscCode 
 { 
   get { return _UniqueDiscCode; } 
   set { _UniqueDiscCode = value; } 
 }
}

public class UniqueDiscCode : DiscCodeBase
{ public void test() { UniqueDiscCode = ""; } }

Сначала я создал класс с префиксом Base, у которого есть свойство UniqueDiscCode, а потом создал класс UniqueDiscCode, который наследует одноименное свойство. И никаких проблем с конфликтом имен нет. 

Возникает тогда вопрос - так почему же нельзя сразу же объявить свойство с таким же именем, что и класс? Видимо есть какая-то причина, но пока не понятно, в чем она заключается. 


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

CS0542

22 Ноября 2013

имена членов не могут совпадать с типами, в которые они входят


Владимир

22 Ноября 2013

Как-то пример у вас не очень удачный получился, не отражает он сути вопроса. "UniqueDiscCode" != "DiscCode" :). Но посыл ясен


Владимир

22 Ноября 2013

Думаю это особенность c# компилятора, как и отсутствие глобальных переменных, и если писать на чистом CIL, то все можно. Более того скажу, что попробовал то же самое в f#, компилятор не ругает, все работает. Походу просто создателям C# такой код кажется не красивым и они решили запретить данную возможность.


Владимир

22 Ноября 2013

А вот еще две не совсем очевидные вещи, о которых можно догадаться, но наверняка лучше проверить:
что будет выведено в консоль?


static int testcode()
{
    try
    {
        throw new Exception("Exceprion1");
    }
    finally
    {
        throw new Exception("Exception2");
    }
}

static void Main(string[] args)
{
    try
    {
        Console.WriteLine(testcode());
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    Console.ReadKey();
}


что вернет функция?

static int testcode()
{
    try
    {
        return 1;
    }
    finally
    {
        return 2;
    }
}


Phosgen

22 Ноября 2013

Я думаю это сделано чтоб не было двусмысленности и путаницы так как конструктор создаётся с таким же именем как и у класса.


Михаил Фленов

22 Ноября 2013

Как-то пример у вас не очень удачный получился, не отражает он сути вопроса. "UniqueDiscCode" != "DiscCode" :). Но посыл ясен


Исправил пример UniqueDiscCode


Михаил Фленов

22 Ноября 2013

Я думаю это сделано чтоб не было двусмысленности и путаницы так как конструктор создаётся с таким же именем как и у класса.


Небольшая путаница может быть если ты создаешь одноименный метод. Свойство пишется без круглых скобок и путаницы нет. После наследования свойства ты без проблем сможешь писать UniqueDiscCode. UniqueDiscCode


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне