我为什么这样做:
public T GetMainContentItem<T>(string moduleKey, string itemKey)
{
return (T)GetMainContentItem(moduleKey, itemKey);
}
Run Code Online (Sandbox Code Playgroud)
但不是这个:
public T GetMainContentItem<T>(string moduleKey, string itemKey)
{
return GetMainContentItem(moduleKey, itemKey) as T;
}
Run Code Online (Sandbox Code Playgroud)
它抱怨我没有足够的限制泛型类型,但我认为该规则也适用于使用"(T)"进行转换.
我发现使用以下内容:
TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }
Run Code Online (Sandbox Code Playgroud)
比以下更容易编写和理解:
if(sender.GetType() == typeof(TreeViewItem)){
TreeViewItem i = (TreeViewItem)sender;
...
}
Run Code Online (Sandbox Code Playgroud)
有没有令人信服的理由不使用第一个结构?
这似乎是一个关于铸造的非常愚蠢的问题,但......
我有以下设置:
主类中有许多类派生.在某个时间点和空间,我得到一个项目,并希望将其作为子类的对象处理.
Asume:
class subClassA : mainclass
class subClassB : mainclass
Run Code Online (Sandbox Code Playgroud)
现在我有一些问题,问它是哪一堂课:
if(someObject is subClassA)
{
subClassA aA = someObject as subClassA ;
}
Run Code Online (Sandbox Code Playgroud)
虽然对于大多数子类,返回正确的对象,但我得到一个子类a null-Object.
如果我执行以下操作:
if(someObject is subClassA)
{
subClassA aA = someObject as subClassA ; // <- aA = null; someObject is shown in debugger as object of subClassA
object test = someObject as subClassA; // <- object is not null
// or
subClassA aB = (subClassA)someObject; // <- object is not null, shows the …Run Code Online (Sandbox Code Playgroud) 说我有以下课程:
class Animal
{
public long Id { get; set; }
public string Name { get; set; }
}
class Dog:Animal
{
public void sniffBum()
{
Console.WriteLine("sniff sniff sniff");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个实例Animal,我该如何将其转换为Dog?像这样的东西:
Animal a = new Animal();
if ( some logic to determine that this animal is a dog )
{
Dog d = (Dog)a;
d.sniffBum();
}
Run Code Online (Sandbox Code Playgroud)
基本上我不能使用接口.我将永远有一个Animal像我这样的数据库.Dog没有任何参数Animal,只有新方法.
我可以创建一个新Dog对象,并传递值,(或者有一个带有类型的构造函数Animal),但这看起来很麻烦.
我想知道,在这种情况下你会使用C#的'as'关键字,而不是转换和检查异常?考虑这个例子:
Parent obj = new Child();
// Method 1:
try
{
Child result1 = (Child)obj;
}
catch (InvalidCastException)
{
// Handle failed cast
}
// Method 2:
if(obj is Child)
{
Child result2 = obj as Child;
}
else
{
// Handle failed cast
}
Run Code Online (Sandbox Code Playgroud)
据我所知,方法1和方法2都产生完全相同的结果.我知道,当它们失败时,as关键字将产生null,而一个转换将抛出一个ClassCastException,但对我而言,这似乎不足以让两个几乎相同的方式来转换对象.所以我想知道,为什么C#语言设计师会遇到添加'as'关键字的麻烦?
在什么情况下每个解决方案优先于另一个?
例1:
if (personList.Any(x => x.Name == "Fox Mulder"))
{
this.Person = personList.Single(x => x.Name == "Fox Mulder");
}
Run Code Online (Sandbox Code Playgroud)
例2:
var mulder = personList.SingleOrDefault(x => x.Name == "Fox Mulder");
if (mulder != null)
{
this.Person = mulder;
}
Run Code Online (Sandbox Code Playgroud) 鉴于这种情况
interface A {}
class B : A {}
A b = new B();
Run Code Online (Sandbox Code Playgroud)
如何检查对象b是否从界面A创建?
可能重复:
使用CLR中的'as'关键字进行转换
foreach (MyClass i in x)
{
if (i is IMy)
{
IMy a = (IMy)i;
a.M1();
}
}
Run Code Online (Sandbox Code Playgroud)
要么
foreach (MyClass i in x)
{
IMy a = i as IMy;
if (a != null)
{
a.M1();
}
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
转换:( NewType)与Object对象作为NewType
Casting vs使用CLR中的'as'关键字
//var gridView = (gridViewRow.NamingContainer as GridView); <-- works too
var gridView = (GridView)gridViewRow.NamingContainer;
Run Code Online (Sandbox Code Playgroud)
我对此的不完全理解是使用as关键字可以null在使用强制转换()时抛出异常.我的目标是能够问自己"我应该选择哪种方式?" 并知道如何回答它.
我已经在VB中编写了很长一段时间,我也可以在C#和F#中做很多事情,但是VB和C#之间的一个语法差异继续让我失望.我是谷歌这个,但我不确定该怎么称呼它.请考虑以下示例:
在visual basic中我会这样做:
Dim Request As HttpWebRequest = HttpWebRequest.Create("www.google.com")
Run Code Online (Sandbox Code Playgroud)
但是,当我做出似乎是对C#的"逻辑"转换时:
HttpWebRequest Request = HttpWebRequest.Create("www.google.com");
Run Code Online (Sandbox Code Playgroud)
我得到隐式类型转换错误.看了一些其他代码后,我意识到这似乎是正确的方法:
HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("www.google.com");
Run Code Online (Sandbox Code Playgroud)
但是我不清楚在括号中另外提到HttpWebRequest类型的目的是什么.这是某种我不知道的演员语法吗?在这里发生了什么使得这项工作,而不是直接转换?
c# ×10
casting ×3
inheritance ×2
types ×2
.net ×1
as-keyword ×1
generics ×1
linq ×1
oop ×1
vb.net ×1