У меня есть класс, содержащий кучу свойств. Это ошибка программиста, если они вызывают ToString() на объекте этого типа. Возьмите этот пример код:C#: Ошибка компилятора команды при использовании myObj.ToString()
using System;
public class Foo
{
public int ID = 123;
public string Name = "SomeName";
private string ToString() { return null; }
}
public class MyClass
{
public static void Main()
{
Foo myObj = new Foo();
WL("I want this to be a compiler error: {0}", myObj.ToString());
RL();
}
#region Helper methods
private static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}
private static void RL()
{
Console.ReadLine();
}
#endregion
}
Можно рассуждать, что если ID это то, что большинство людей хотят выписаны в виде строки, то я должен выполнять ToString так, что она возвращает идентификатор. Однако я считаю, что это плохая практика, потому что программисты «случайно» получат рабочий код. Программист, использующий мой класс, должен указать, что они хотят.
Вместо этого мне хотелось бы, чтобы кто-то вызывал myObj.ToString(), чтобы это отображалось как ошибка времени компиляции. Я думал, что могу сделать это, создав частную функцию ToString(), но это не сработает.
Причина, по которой я привел это, состоит в том, что мы получили строку запроса, содержащую полное имя класса, а не идентификатор.
Вопрос в следующем: Есть ли способ «скрыть» функцию ToString(), чтобы вызов ее на объект моего класса вызывал ошибку компилятора?
Ehh ... это, вероятно, менее «хакерское», чем переопределение ToString() с неправильным возвратом. – EBGreen 2008-10-20 15:45:14
Он работает, по крайней мере. Возможно, .NET-пользователям необходимо добавить атрибут «IToldYouNeverToCallMe». – MusiGenesis 2008-10-20 16:10:12
Это работает, и это решение, с которым я столкнулся, если Джейсон Джексон не станет хорошей причиной, почему я не должен. – 2008-10-20 16:14:28