我正在通过Asp.Net MVC课程并了解到,对于一种方法来确定控制器的动作,
我对某些泛型有所了解并在某种程度上使用它们,但是:
假设我们有通用方法:
public void GenericMethod<T>(T item)
{
var typeOf = typeof(T);
var getType = item.GetType();
}
Run Code Online (Sandbox Code Playgroud)
我们使用以下参数调用它:
GenericMethod(1)
GenericMethod((object) 1)
Run Code Online (Sandbox Code Playgroud)
结果是:
typeOf = System.Int32
getType = System.Int32
Run Code Online (Sandbox Code Playgroud)
和
typeOf = System.Object
getType = System.Int32
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么输入到对象的typeof整数返回System.Object,但.GetType()返回System.Int32?
根据C#规范10.4 Constants:
常量声明中指定的类型必须是 sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,string,enum-type 或reference-type.每个常量表达式必须生成目标类型或可通过隐式转换(第6.1节)转换为目标类型的类型的值.
为什么我不能做以下事情:
public class GenericClass<T>
where T : class
{
public const T val = null;
}
Run Code Online (Sandbox Code Playgroud)
这应该是可能的,因为:
where T : class意思是,The type argument must be a reference type; this applies also to any class, interface, delegate, or array type(来自MSDN)stringis 之外的引用类型常量的唯一可能值null.任何可能的解释?
我有以下代码.我希望它打印:
A
B
C
DONE
Run Code Online (Sandbox Code Playgroud)
相反它打印
P
P
P
DONE
Run Code Online (Sandbox Code Playgroud)
为什么?
更新
我不是要求解决方案.我想知道为什么会这样.我认为泛型在编译时得到了解决.从我可以告诉它应该能够在编译时将这些解析为正确的方法,但显然它不是,我不明白为什么.我正在寻找解释原因的解释,而不是解决方案.
这是代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication50
{
class Parent
{
public string FieldName { get; set; }
public string Id { get; set; }
}
class ChildA : Parent
{
public string FieldValue { get; set; }
}
class ChildB : Parent
{
public DateTime? Start { get; set; }
public DateTime? End { get; set; }
}
class ChildC : Parent …Run Code Online (Sandbox Code Playgroud) 这可能吗?
当一个类型被传入一个方法时,我想实例化泛型类myClass
public class myClass<T>
{
}
public void PassInType(Type myType)
{
myClass<myType> c=new myClass<myType>();
}
Run Code Online (Sandbox Code Playgroud)
更新:
好吧,因为那是不可能的,我该怎么做
public myMethod(string myType)
{
myClass<myType> c=new myClass<myType>();
}
Run Code Online (Sandbox Code Playgroud) 我有一堂课电影:
internal class Movie
{
public string Name { get; set; }
public string Year { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有这个代码:
var Movies = CreateMovies(); //IEnumerable<Movie>
var sorter = new Sorter<Movie>();
sorter.AddSort(Movies, m => m.Year , a=>a.Name ,.....as many as I want....);
Run Code Online (Sandbox Code Playgroud)
这是Sorter班级:
class Sorter<T>
{
public void AddSort(IEnumerable<T> movs, params Expression<Func<T, object>>[] funcs)
{
/*...*/
movs.OrderBy(d=>d.); //<----- here is the problem : where is the columns ?
}
}
Run Code Online (Sandbox Code Playgroud)
题 :
当我需要智慧时d,它告诉我:

我不明白为什么T不推断为 …