dotnet-api-docs
dotnet-api-docs copied to clipboard
Example code has runtime error
[System.ArgumentNullException: Value cannot be null. Parameter name: key] at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValue(TKey key, TValue& value)
line: else if (cwt.TryGetValue(mc2, out data))
Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.
- ID: 61958f86-854a-f76a-19e1-fbc4b2f20366
- Version Independent ID: 6a9b0e31-d0a6-c930-7959-20ac6f03ec4a
- Content: ConditionalWeakTable<TKey,TValue> Class (System.Runtime.CompilerServices)
- Content Source: [xml/System.Runtime.CompilerServices/ConditionalWeakTable
2.xml](https://github.com/dotnet/dotnet-api-docs/blob/master/xml/System.Runtime.CompilerServices/ConditionalWeakTable2.xml) - Product: dotnet-api
- GitHub Login: @rpetrusha
- Microsoft Alias: ronpet
Thanks for pointing this out, @ackerman76. The ConditionalWeakTable<TKey,TValue>.TryGetValue method documents the ArgumentNullException, but this example nevertheless passes a null value to the method. It also does a very poor job of demonstrating the type. We'll replace it with a new example in an upcoming sprint.
Moreover, example here even does not compile:
namespace ConsoleApp3
{
using System;
using System.Runtime.CompilerServices;
public class Example
{
public static void Main()
{
var mc1 = new ManagedClass();
var mc2 = new ManagedClass();
var mc3 = new ManagedClass();
var cwt = new ConditionalWeakTable<ManagedClass, ClassData>();
cwt.Add(mc1, new ClassData());
cwt.Add(mc2, new ClassData());
cwt.Add(mc3, new ClassData());
var wr2 = new WeakReference(mc2);
mc2 = null;
GC.Collect();
ClassData data = null;
if (wr2.Target == null)
Console.WriteLine("No strong reference to mc2 exists.");
else if (cwt.TryGetValue(wr2.Target, out data)) <----------CS1503 Argument 1: cannot convert from 'object' to 'ConsoleApp3.ManagedClass'
Console.WriteLine("Data created at {0}", data.CreationTime);
else
Console.WriteLine("mc2 not found in the table.");
}
}
public class ManagedClass
{
}
public class ClassData
{
public DateTime CreationTime;
public object Data;
public ClassData()
{
CreationTime = DateTime.Now;
this.Data = new object();
}
}
// The example displays the following output:
// No strong reference to mc2 exists.
}
And finally it shows different output 😕 after fixing else if (cwt.TryGetValue((ManagedClass)wr2.Target, out data)):
Data created at 07.11.2020 14:32:29
My project:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
</Project>
It seems to me that the example does not work at all.
Hi @sungam3r
it seems that splitting the main in two function show the correct output :
class Program
{
static void Main(string[] args)
{
var cwt = new ConditionalWeakTable<ManagedClass, ClassData>();
WeakReference wr2 = Init(cwt);
GC.Collect();
ClassData data = null;
if ( !(wr2.Target is ManagedClass b))
{
Console.WriteLine("No strong reference to mc2 exists.");
}
else
{
if (cwt.TryGetValue(b, out data))
Console.WriteLine("Data created at {0}", data.CreationTime);
else Console.WriteLine("mc2 not found in the table.");
}
}
private static WeakReference Init(ConditionalWeakTable<ManagedClass, ClassData> cwt)
{
var mc1 = new ManagedClass();
var mc2 = new ManagedClass();
var mc3 = new ManagedClass();
cwt.Add(mc1, new ClassData());
cwt.Add(mc2, new ClassData());
cwt.Add(mc3, new ClassData());
var wr2 = new WeakReference(mc2);
mc2 = null;
return wr2;
}
}
public class ManagedClass
{
}
public class ClassData
{
public DateTime CreationTime;
public object Data;
public ClassData()
{
CreationTime = DateTime.Now;
this.Data = new object();
}
}
And I got :
No strong reference to mc2 exists.
The question remains - why doesn't the first example work (both debug and release)?