Поскольку fred не является булевской переменной. это - структура, которая имеет булево свойство под названием IsNull или HasValue, или безотносительно... Объект, названный fred, является сложным составным объектом, содержащим булевскую переменную и значение, не саму примитивную булевскую переменную...
Ниже, например, то, как мог быть реализован Интервал Nullable. Универсальный Nullable почти наверняка реализован так же (но в общем). Вы видите здесь, как неявные и явные преобразования реализованы..
public struct DBInt
{
// The Null member represents an unknown DBInt value.
public static readonly DBInt Null = new DBInt();
// When the defined field is true, this DBInt represents a known value
// which is stored in the value field. When the defined field is false,
// this DBInt represents an unknown value, and the value field is 0.
int value;
bool defined;
// Private instance constructor. Creates a DBInt with a known value.
DBInt(int value)
{
this.value = value;
this.defined = true;
}
// The IsNull property is true if this DBInt represents an unknown value.
public bool IsNull { get { return !defined; } }
// The Value property is the known value of this DBInt, or 0 if this
// DBInt represents an unknown value.
public int Value { get { return value; } }
// Implicit conversion from int to DBInt.
public static implicit operator DBInt(int x)
{ return new DBInt(x); }
// Explicit conversion from DBInt to int. Throws an exception if the
// given DBInt represents an unknown value.
public static explicit operator int(DBInt x)
{
if (!x.defined) throw new InvalidOperationException();
return x.value;
}
public static DBInt operator +(DBInt x)
{ return x; }
public static DBInt operator -(DBInt x)
{ return x.defined? -x.value: Null; }
public static DBInt operator +(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value + y.value: Null;
}
public static DBInt operator -(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value - y.value: Null;
}
public static DBInt operator *(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value * y.value: Null;
}
public static DBInt operator /(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value / y.value: Null;
}
public static DBInt operator %(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value % y.value: Null;
}
public static DBBool operator ==(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value == y.value: DBBool.Null;
}
public static DBBool operator !=(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value != y.value: DBBool.Null;
}
public static DBBool operator >(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value > y.value: DBBool.Null;
}
public static DBBool operator <(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value < y.value: DBBool.Null;
}
public static DBBool operator >=(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value >= y.value: DBBool.Null;
}
public static DBBool operator <=(DBInt x, DBInt y)
{
return x.defined && y.defined?
x.value <= y.value: DBBool.Null;
}
public override bool Equals(object o)
{
try { return (bool) (this == (DBInt) o); }
catch { return false; }
}
public override int GetHashCode()
{ return (defined)? value: 0; }
public override string ToString()
{ return (defined)? .ToString(): "DBInt.Null"; }
}
Помимо того, что сказал Джонатан Сэмпсон, вы не должны использовать имена, которые используются для свойств объектов формы. В Центре разработчиков Mozilla есть список, который, если вы внимательно посмотрите, содержит свойство elements
, важное для вас, поскольку к элементам формы можно обращаться как к прямым атрибутам объекта формы. Например, в вашем случае:
form.elements; // collides with the built-in elements property
form.e2;
Поэтому будьте осторожны и не используйте такие имена, как method
или action
, которые также будут конфликтовать со значением метода
и action
атрибуты элемента формы. Надеюсь, вы уловили идею.
Здесь есть разница между «недопустимыми» именами и «взятыми» именами в отношении свойств DOM.
Ответ Джонатана Сэмпсона хорошо подходит для рассмотрения «недопустимых» имен, но на основе ваших В предыдущем вопросе, как вы думаете, о чем вы спрашиваете, так это о «взятых» именах, например, «каковы все остальные свойства DOM на узле формы?»
Краткий ответ: много.
Подробный ответ по сути является суммой этих двух списков , что означает «свойства DOM, общие для ВСЕХ узлов» и «свойства DOM, уникальные для формирования узлов»
Большие, о которых вы действительно хотите беспокоиться это второй список - они могут нарушить работу вашей формы.
Их довольно много.
Все это допустимые методы / свойства, которые можно найти в элементах FORM (из-за наследования интерфейса), и все они могут быть перезаписаны одинаковыми- именованные поля. Поэтому я бы посоветовал избегать этих имен, чтобы не столкнуться с случайными конфликтами:
Node interface members
ELEMENT_NODE
ATTRIBUTE_NODE
TEXT_NODE
CDATA_SECTION_NODE
ENTITY_REFERENCE_NODE
ENTITY_NODE
PROCESSING_INSTRUCTION_NODE
COMMENT_NODE
DOCUMENT_NODE
DOCUMENT_TYPE_NODE
DOCUMENT_FRAGMENT_NODE
NOTATION_NODE
nodeName
nodeValue
nodeType
parentNode
childNodes
firstChild
lastChild
previousSibling
nextSibling
attributes
ownerDocument
insertBefore
replaceChild
removeChild
appendChild
hasChildNodes
cloneNode
normalize
isSupported
namespaceURI
prefix
localName
hasAttributes
HTMLElement interface members
id
title
lang
dir
className
HTMLFormElement interface members
elements
length
name
acceptCharset
action
enctype
method
target
submit
reset
item
namedItem
Я также провел некоторое время назад тест для этих , который позволяет проверить, как разные браузеры «ведут себя» с этими именами .
Если ваша цель - избежать конфликта с любыми возможными ранее существовавшими свойствами объекта формы в javascript, то я думаю, что официальный стандарт, который вы ищете, - это объектная модель документа.
Если вы хотите поэкспериментировать и посмотреть, каковы встроенные свойства объекта формы в реальном браузере, попробуйте следующее:
<html><body onLoad="showEm()">
<form id="foo"></form>
<script>
function showEm() {
for(var e in document.getElementById("foo")) {
document.writeln(e);
document.writeln("<br>");
}
}
</script>
<body>
</html>
Обратите внимание, однако, что подавляющее большинство из них было бы безвредно для вас, если вы «переопределите», а я ' m даже не уверен, все ли они могут быть отменены.
Спасибо всем за полезные ответы. Ответы, похоже, ориентированы на то, что находится в DOM, и их не следует использовать (например, «элементы» и т. Д.). Другая часть вопроса - какие символы разрешены.
Я нашел спецификацию того, какие символы разрешены для токенов имен в HTML4 , в котором говорится:
6.2 Основные типы SGML
...
- Жетоны ID и NAME должны начинаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифр ([0-9]), дефисами ("-") , подчеркивания ("_"), двоеточия (":") и точки (".").
Не начинайте с цифр («1 корова»), не используйте знаки препинания («одна корова !?») и не включайте пробелы («одна корова»).
Там это случаи, когда вы можете использовать квадратные скобки [и], если вы PHP-программист и хотите создать массив из нескольких элементов с одинаковым именем.
<input name='colors[]' value='blue' />
<input name='colors[]' value='black' />
Учитывая вашу первоначальную проблему, я подозреваю, что это всего лишь метод проб и ошибок или глубокое знание библиотек, которые вы используете (что может быть нереальным, само собой разумеется).
Конечно, придерживайтесь буквенные символы, но можно добавить числовое значение в конец.
Для многих в ASP.NET может помочь ошибка, добавляющая долларовую нотацию к тегу имени, так что вы можете попробовать. Конечно, мне интересно посмотреть, что произойдет.
Насколько мне известно, "зарезервированных слов" как таковых не существует, поэтому при соблюдении критериев в отношении допустимых символов (без пробелов, знаков препинания и должны начинаться с буквы) имя атрибут может содержать что угодно.