Asp.net mvc 3 Can';即使运算符重载,也不能强制转换为字符串
使用MVC3和类型为Asp.net mvc 3 Can';即使运算符重载,也不能强制转换为字符串,asp.net-mvc-3,c#-4.0,casting,operator-overloading,Asp.net Mvc 3,C# 4.0,Casting,Operator Overloading,使用MVC3和类型为MyType的属性上的StringLength验证属性,我得到一个异常: 无法将“MyType”类型的对象强制转换为“System.String”类型 所以我添加了一个操作符重载,下面是我的类: public class MyType<T> { public T Value { get; set; } //... public static implicit operator string(MyType<T> instance
MyType
的属性上的StringLength
验证属性,我得到一个异常:
无法将“MyType”类型的对象强制转换为“System.String”类型
所以我添加了一个操作符重载,下面是我的类:
public class MyType<T>
{
public T Value { get; set; }
//...
public static implicit operator string(MyType<T> instance)
{
//Return the internal value of the instance.
return Convert.ToString(instance.Value);
}
}
看起来应该行得通,我还缺什么
public override bool IsValid(object value)
{
this.EnsureLegalLengths();
int num = (value == null) ? 0 : ((MyType<string>)value).Value.Length;
return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}
Edit:不要将
MyType
传递给该方法,将MyType.Value
传递给该方法,以便强制转换成功。您使用的是隐式强制转换,您应该执行显式强制转换,因为框架显式强制转换了它。像这样:
(string)value
您应该添加:
public static explicit operator string(MyType<T> instance)
{
//Return the internal value of the instance.
return Convert.ToString(instance.Value);
}
公共静态显式运算符字符串(MyType实例)
{
//返回实例的内部值。
返回Convert.ToString(instance.Value);
}
变量值
声明为对象类型
。您必须首先强制转换为实际类型,因为基础对象不是字符串
。没有定义从对象
到其他类型的转换,因此您所做的转换实际上是告诉编译器此对象实际上是字符串
,而不是。这本质上与取消装箱值类型时必须遵循的规则相同
通过首先将其强制转换为您的类型,编译器可以实现从您的类型到所需的字符串类型的(隐式)转换,并可以生成适当的指令
e、 g
object obj = new MyObject<string> { Value = "Foobar" };
string x = (string)obj; // fail: obj is not a string
string y = (MyObject<string>)obj; // obj: obj is cast to MyObject<string> and
// an implicit cast to string exists
// to be clearer
string z = (string)(MyObject<string>)obj;
objectobj=newmyobject{Value=“Foobar”};
字符串x=(字符串)obj;//失败:obj不是字符串
字符串y=(MyObject)obj;//obj:obj被投射到MyObject并
//存在对字符串的隐式强制转换
//更清楚地说
字符串z=(字符串)(MyObject)obj;
该代码来自使用ILSpy的.NET framework。这在StringLengthAttribute
类中。@JoshM。那么,您不能将类型MyType
传递给该方法。只需传递MyType.Value
。这对你来说很有用,因为那是字符串
。它在MVC中是自动处理的,我没有手动传递任何东西,它发生在客户端验证期间,然后在回发时再次发生。我认为这是不对的,重载操作符的目的是让你可以将对象强制转换为另一种类型。因此公共静态隐式运算符字符串(MyType实例)
返回对象的字符串表示形式。即使是有效的
方法接受对象
,框架也知道底层类型是什么,您不必首先显式地将其转换为该类型;但我不明白为什么。框架知道它试图将什么类型的对象转换为字符串
,我告诉了它如何进行转换。它似乎会检查实际类型上的隐式转换,而不是传入的类型。但在这里,编译器只能使用编译时已知的内容。我们所知道的只是我们被赋予了某种目标。对象的实际类型并不是真正已知的,只是它是对象
或从对象派生而来。因此,在编译时,唯一已知的从对象
到实际(或派生程度较低)类型的转换是非转换类型转换。因此,编译器生成了非转换强制转换的指令,但由于我上面解释的原因,它失败了。如果它被声明为dynamic
,那么运行时本可以发挥它的神奇作用。我确实尝试了显式
操作符,但它不起作用-我会再试一次。但是,我相信如果您定义一个隐式运算符
,那么它就可以满足显式
和隐式
强制转换的要求了……否?
public static explicit operator string(MyType<T> instance)
{
//Return the internal value of the instance.
return Convert.ToString(instance.Value);
}
object obj = new MyObject<string> { Value = "Foobar" };
string x = (string)obj; // fail: obj is not a string
string y = (MyObject<string>)obj; // obj: obj is cast to MyObject<string> and
// an implicit cast to string exists
// to be clearer
string z = (string)(MyObject<string>)obj;