TL; DR: Попробуйте использовать Html.Partial
вместо Renderpage
Я получал Object reference not set to an instance of an object
, когда пытался сделать вид в представлении, отправив ему модель, например это:
@{
MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null
Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:
@{
MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);
И это сработало.
Кроме того, причина, по которой я не имел Html.Partial
для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach
, хотя это не ошибка:
@inherits System.Web.Mvc.WebViewPage
@{
ViewBag.Title = "Entity Index";
List<MyEntity> MyEntities = new List<MyEntity>();
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
}
<div>
@{
foreach(var M in MyEntities)
{
// Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
@Html.Partial("MyOtherView.cshtml");
}
}
</div>
Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach
, чтобы выглядеть так:
@foreach(var M in MyEntities){
...
}
Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .
Оператор implicit
работает только для назначения.
Вы хотите перегрузить оператор равенства (==
) следующим образом:
class a
{
public static bool operator ==(a x, b y)
{
return x == y.a;
}
public static bool operator !=(a x, b y)
{
return !(x == y);
}
}
class b
{
public a a{get;set;}
public static implicit operator a(b b)
{
return b.a;
}
}
Затем это должно разрешить вы сравниваете два объекта типа a
и b
, как было предложено в вашем сообщении.
var x = new a();
var y = new b();
bool c = (x == y); // compiles
Примечание:
Я рекомендую просто переопределить GetHashCode
и Equals
, как компилятор предупреждает, но поскольку вы, похоже, хотите их подавить, вы можете сделать это следующим образом.
Измените объявление класса a
на:
#pragma warning disable 0660, 0661
class a
#pragma warning restore 0660, 0661
{
// ...
}
http://msdn.microsoft.com/en-us/library/8edha89s.aspx
В каждом случае один параметр должен быть одного и того же типа как класс или структура, объявляющая оператор (...)
Возможно ли использовать оператор == на экземплярах разных типов, где можно неявно преобразовать в другое?
blockquote>Да.
Что я пропустил?
blockquote>Вот соответствующая часть спецификации. Вы пропустили выделенное слово.
Предопределенные операторы равенства ссылочного типа требуют [чтобы] оба операнда были значениями ссылочного типа или буквальным нулем. Кроме того, стандартное неявное преобразование существует из типа любого операнда в тип другого операнда.
blockquote>Пользовательское преобразование по определению не является стандартным преобразованием. Это ссылочные типы. Поэтому предопределенный оператор равенства ссылочного типа не является кандидатом.
Если типы должны быть одним и тем же вызовом ==, то почему [double == int] работает?
blockquote >Ваше предположение, что типы должны быть одинаковыми, неверно. Существует стандартное неявное преобразование из int в double, и есть оператор равенства, который принимает два удвоения, поэтому это работает.
Я думаю, вы также пропустили этот бит:
Ошибка времени компиляции использовать предопределенные операторы равенства ссылочного типа для сравнения двух ссылок, которые, как известно, различны во время компиляции. Например, если типы экземпляров типа компиляции являются двумя типами классов A и B, и если ни A, ни B не являются производными от другого, тогда было бы невозможно, чтобы оба операнда ссылались на один и тот же объект. Таким образом, операция считается ошибкой времени компиляции.
blockquote>
Используйте этот параметр
bool c = a.Equals(b);
Я бы предположил, что вам нужно на самом деле переопределить оператор == для типов, которые вас интересуют. Будет ли компиляция / время выполнения по-прежнему жаловаться, даже если типы являются конвертируемыми implicity, вам нужно поэкспериментировать.
public static bool operator ==(a a, b b)
{
//Need this check or we can't do obj == null in our Equals implementation
if (((Object)a) == null)
{
return false;
}
else
{
return a.Equals(b);
}
}
В качестве альтернативы просто используйте реализации Equals, такие как ole6ka, и убедитесь, что реализация делает нужное вам применение.